190 lines
6.3 KiB
JavaScript
190 lines
6.3 KiB
JavaScript
flectra.define('document.document', function (require) {
|
|
"use strict";
|
|
|
|
var core = require('web.core');
|
|
var Dialog = require('web.Dialog');
|
|
var framework = require('web.framework');
|
|
var Sidebar = require('web.Sidebar');
|
|
var field_utils = require('web.field_utils');
|
|
|
|
var _t = core._t;
|
|
|
|
Sidebar.include({
|
|
/**
|
|
* @override
|
|
*/
|
|
init : function (parent, options) {
|
|
this._super.apply(this, arguments);
|
|
if (options.viewType === "form") {
|
|
this.sections.splice(1, 0, { 'name' : 'files', 'label' : _t('Attachment(s)'), });
|
|
this.items.files = [];
|
|
}
|
|
this.fileuploadId = _.uniqueId('oe_fileupload');
|
|
$(window).on(this.fileuploadId, this._onFileUploaded.bind(this));
|
|
},
|
|
/**
|
|
* Get the attachment linked to the record when the toolbar started
|
|
*
|
|
* @override
|
|
*/
|
|
start: function () {
|
|
var _super = this._super.bind(this);
|
|
this._updateAttachments().then(_super);
|
|
},
|
|
/**
|
|
* @override
|
|
*/
|
|
destroy: function () {
|
|
$(window).off(this.fileuploadId);
|
|
this._super.apply(this, arguments);
|
|
},
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Public
|
|
//--------------------------------------------------------------------------
|
|
/**
|
|
* @override
|
|
*/
|
|
updateEnv: function (env) {
|
|
this.env = env;
|
|
this._updateAttachments().then(this._redraw.bind(this));
|
|
},
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Private
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Process the attachments then rerender the toolbar
|
|
*
|
|
* @private
|
|
* @param {Object} attachments
|
|
*/
|
|
_processAttachments: function (attachments) {
|
|
//to display number in name if more then one attachment which has same name.
|
|
var self = this;
|
|
_.chain(attachments)
|
|
.groupBy(function (attachment) { return attachment.name; })
|
|
.each(function (attachment) {
|
|
if (attachment.length > 1) {
|
|
_.map(attachment, function (attachment, i) {
|
|
attachment.name = _.str.sprintf(_t("%s (%s)"), attachment.name, i+1);
|
|
});
|
|
}
|
|
});
|
|
_.each(attachments,function (a) {
|
|
a.label = a.name;
|
|
if (a.type === "binary") {
|
|
a.url = '/web/content/' + a.id + '?download=true';
|
|
}
|
|
a.create_date = field_utils.parse.datetime(a.create_date, 'create_date', {isUTC: true});
|
|
a.create_date_string = field_utils.format.datetime(a.create_date, 'create_date', self.env.context.params);
|
|
a.write_date = field_utils.parse.datetime(a.write_date, 'write_date', {isUTC: true});
|
|
a.write_date_string = field_utils.format.datetime(a.write_date, 'write_date', self.env.context.params);
|
|
});
|
|
this.items.files = attachments;
|
|
},
|
|
/**
|
|
* @private
|
|
* @override
|
|
*/
|
|
_redraw: function () {
|
|
this._super.apply(this, arguments);
|
|
this.$('.o_sidebar_add_attachment .o_form_binary_form')
|
|
.change(this._onAddAttachment.bind(this));
|
|
this.$('.o_sidebar_delete_attachment')
|
|
.click(this._onDeleteAttachment.bind(this));
|
|
},
|
|
/**
|
|
* Update the attachments to be displayed in the attachment section
|
|
* of the toolbar
|
|
*
|
|
* @private
|
|
*/
|
|
_updateAttachments: function () {
|
|
var activeId = this.env.activeIds[0];
|
|
if (!activeId) {
|
|
this.items.files = [];
|
|
return $.when();
|
|
} else {
|
|
var domain = [
|
|
['res_model', '=', this.env.model],
|
|
['res_id', '=', activeId],
|
|
['type', 'in', ['binary', 'url']]
|
|
];
|
|
var fields = ['name', 'url', 'type',
|
|
'create_uid', 'create_date', 'write_uid', 'write_date'];
|
|
return this._rpc({
|
|
model: 'ir.attachment',
|
|
method: 'search_read',
|
|
context: this.env.context,
|
|
domain: domain,
|
|
fields: fields,
|
|
}).then(this._processAttachments.bind(this));
|
|
}
|
|
},
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Handlers
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Method triggered when user click on 'add attachment' and select a file
|
|
*
|
|
* @private
|
|
* @param {Event} event
|
|
*/
|
|
_onAddAttachment: function (event) {
|
|
var $event = $(event.target);
|
|
if ($event.val() !== '') {
|
|
var $binaryForm = this.$('form.o_form_binary_form');
|
|
$binaryForm.submit();
|
|
$binaryForm.find('input[type=file]').prop('disabled', true);
|
|
$binaryForm.find('button').prop('disabled', true).find('img, span').toggle();
|
|
this.$('.o_sidebar_add_attachment a').text(_t('Uploading...'));
|
|
framework.blockUI();
|
|
}
|
|
},
|
|
/**
|
|
* Method triggered when user delete an attachment
|
|
*
|
|
* @private
|
|
* @param {Event} event
|
|
*/
|
|
_onDeleteAttachment: function (event) {
|
|
event.preventDefault();
|
|
var self = this;
|
|
var $event = $(event.currentTarget);
|
|
var options = {
|
|
confirm_callback: function () {
|
|
self._rpc({
|
|
model: 'ir.attachment',
|
|
method: 'unlink',
|
|
args: [parseInt($event.attr('data-id'), 10)],
|
|
})
|
|
.then(self._updateAttachments.bind(self))
|
|
.then(self._redraw.bind(self));
|
|
}
|
|
};
|
|
Dialog.confirm(this, _t("Do you really want to delete this attachment ?"), options);
|
|
},
|
|
/**
|
|
* Handler called when the upload is done
|
|
*
|
|
* @private
|
|
*/
|
|
_onFileUploaded: function () {
|
|
var attachments = Array.prototype.slice.call(arguments, 1);
|
|
var uploadErrors = _.filter(attachments, function (attachment) {
|
|
return attachment.error;
|
|
});
|
|
if (uploadErrors.length) {
|
|
this.do_warn(_t('Uploading Error'), uploadErrors[0].error);
|
|
}
|
|
this._updateAttachments().then(this._redraw.bind(this));
|
|
framework.unblockUI();
|
|
}
|
|
});
|
|
|
|
});
|