[FIX] document_indexation: removes the attachment sidebar button

This commit removes the attachment button from the sidebar.

Reason:

following the introduction of the attachment button in the chatter (7f97c9fc05)
and the partial removal of this feature (1dbb555aab) in V12.0,
it has been decided that the chatter button will completely replace this feature.

closes odoo/odoo#29468
This commit is contained in:
Thanh Dodeur
2018-12-12 14:05:48 +00:00
parent 1599d0bc42
commit d3b8422c9c
5 changed files with 0 additions and 374 deletions
@@ -11,8 +11,5 @@ Attachments list and document indexation
* Document Indexation: odt
""",
'depends': ['web'],
'data': [
'views/attachment_indexation_templates.xml',
],
'installable': True,
}
@@ -1,200 +0,0 @@
odoo.define('attachment_indexation.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);
this.hasAttachments = options.viewType === "form";
if (this.hasAttachments) {
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);
var def = this.hasAttachments ? this._updateAttachments() : $.when();
return def.then(_super);
},
/**
* @override
*/
destroy: function () {
if (this.hasAttachments) {
$(window).off(this.fileuploadId);
}
this._super.apply(this, arguments);
},
//--------------------------------------------------------------------------
// Public
//--------------------------------------------------------------------------
/**
* @override
*/
updateEnv: function (env) {
this.env = env;
var _super = _.bind(this._super, this, env);
var def = this.hasAttachments ? this._updateAttachments() : $.when();
def.then(_super);
},
//--------------------------------------------------------------------------
// 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);
if (this.hasAttachments) {
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 () {
if (this.items.files === undefined) {
return $.when();
}
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();
}
});
});
@@ -1,112 +0,0 @@
odoo.define('attachment_indexation.tests', function (require) {
"use strict";
var testUtils = require('web.test_utils');
var FormView = require('web.FormView');
var ListView = require('web.ListView');
var createView = testUtils.createView;
QUnit.module('AttachmentIndexationTest', {
beforeEach: function () {
this.data = {
partner: {
fields: {
display_name: { string: "Displayed name", type: "char" }
},
records: [{
id: 1,
display_name: "first record",
}, {
id: 2,
display_name: "second record",
}]
},
'ir.attachment': {
fields: {
type: { string: "Type", type: "char" },
name: {string: "Name", type: "char"},
res_id: {string: "ResId", type: "integer"},
res_model: {string: "ResModel", type: "char"}
},
records: [{
id: 1,
type:"binary",
name: "attachment1",
res_id: 1,
res_model: 'partner'
},{
id: 2,
type:"binary",
name: "attachment2",
res_id: 1,
res_model: 'partner'
}]
}
};
}
}, function () {
QUnit.module('DocView');
QUnit.test('AttachmentIndexationAttachmentTest', function (assert) {
assert.expect(3);
var form = createView({
View: FormView,
model: 'partner',
data: this.data,
arch: '<form string="Partners">' +
'<sheet>' +
'<field name="display_name"/>' +
'</sheet>' +
'</form>',
res_id: 1,
viewOptions: {hasSidebar: true},
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when(this.data['ir.attachment'].records);
}
if (route === '/web/dataset/call_kw/ir.attachment/unlink') {
assert.strictEqual(args.args[0], 1, "Should have correct id of the attachment to be deleted");
}
return this._super.apply(this, arguments);
}
});
assert.containsN(form.sidebar, '.o_sidebar_delete_attachment', 2, "there should be two attachments");
testUtils.dom.click(form.sidebar.$('.o_dropdown_toggler_btn:contains("Attachment")'));
testUtils.dom.click(form.sidebar.$('.o_sidebar_delete_attachment:eq(0)'));
testUtils.dom.click($('.modal-footer .btn-primary'));
assert.containsOnce(form.sidebar, '.o_sidebar_delete_attachment', "there should be only one attachment");
form.destroy();
});
QUnit.test('no attachment on list view', function (assert) {
assert.expect(4);
var list = createView({
View: ListView,
model: 'partner',
data: this.data,
groupBy: ['display_name'],
viewOptions: {sidebar: true},
arch: '<tree string="Partners">' +
'<field name="display_name"/>' +
'</tree>',
mockRPC: function (route, args) {
assert.step(args.model);
return this._super.apply(this, arguments);
}
});
// select record then trigger render
testUtils.dom.click(list.$('.o_group_header:last'));
testUtils.dom.click(list.$('.o_data_row input'));
testUtils.dom.click(list.$('.o_group_header:first'));
assert.verifySteps(['partner', 'partner', 'partner'],
"ir.attachment not called when selecting record in list view");
list.destroy();
});
});
});
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_backend" name="document assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/attachment_indexation/static/src/js/attachment_indexation.js"></script>
</xpath>
</template>
<template id="qunit_suite" name="document tests" inherit_id="web.qunit_suite">
<xpath expr="//script[last()]" position="after">
<script type="text/javascript" src="/attachment_indexation/static/tests/attachment_indexation_tests.js"/>
</xpath>
</template>
</odoo>
@@ -1634,12 +1634,6 @@ QUnit.module('Views', {
'</form>',
viewOptions: {hasSidebar: true},
res_id: 1,
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
});
assert.isVisible(form.sidebar);
@@ -1782,12 +1776,6 @@ QUnit.module('Views', {
'</form>',
res_id: 1,
viewOptions: {hasSidebar: true},
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
});
assert.strictEqual(form.$('.o_control_panel .breadcrumb').text(), 'first record',
@@ -1822,9 +1810,6 @@ QUnit.module('Views', {
assert.strictEqual(args.kwargs.context.hey, 'hoy',
"should have send the correct context");
}
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
});
@@ -1847,12 +1832,6 @@ QUnit.module('Views', {
'</form>',
res_id: 1,
viewOptions: {hasSidebar: true},
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
});
assert.strictEqual(form.$('.o_control_panel .breadcrumb').text(), 'first record',
@@ -2394,12 +2373,6 @@ QUnit.module('Views', {
arch: '<form string="Partners"><field name="foo"></field></form>',
res_id: 1,
viewOptions: {hasSidebar: true},
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
});
testUtils.form.clickEdit(form);
testUtils.fields.editInput(form.$('input[name=foo]'), 'tralala');
@@ -2736,12 +2709,6 @@ QUnit.module('Views', {
hasSidebar: true,
},
res_id: 1,
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
});
assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should be 1');
@@ -2781,9 +2748,6 @@ QUnit.module('Views', {
},
res_id: 1,
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
assert.step(args.method);
return this._super.apply(this, arguments);
}
@@ -4945,9 +4909,6 @@ QUnit.module('Views', {
"the active_ids should be an array with 1 inside.");
return $.when({});
}
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
});
@@ -6224,9 +6185,6 @@ QUnit.module('Views', {
res_id: 1,
viewOptions: {hasSidebar: true},
mockRPC: function (route, args) {
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
var result = this._super.apply(this, arguments);
if (args.method === 'copy') {
return result.then(function (id) {
@@ -6878,9 +6836,6 @@ QUnit.module('Views', {
if (args.method === 'unlink') {
assert.step('unlink');
}
if (args.method === 'search_read' && args.model === 'ir.attachment') {
return $.when([]);
}
return this._super.apply(this, arguments);
},
res_id: 1,