Menghilangkan Action Archive/Unarchive object tertentu di Odoo 14

Bismillah,

Assalamu'alaikum Warohmatullah Wabarokatuh,


Pada kesempatan kali ini saya akan berbagi sedikit ilmu yang saya miliki terkait technical documentation custom odoo, yaitu menghilangkan action archive/unarchive di Odoo 14.

seperti yang kita tahu bahwa, di dalam tampilan tree maupun form terdapat beberapa action, diantaranya Archive/Unarchive, Duplicate dan Delete, khusus untuk action delete pada tampilan tree maupun form bisa kita hilangkan dengan menambahkan atribut delete="false" dalam tag tree maupun tag form, sedangkan untuk archive/unarchive tidak bisa dilakukan dengan cara tersebut, solusi yang bisa kita lakukan adalah dengan melakukan inherit pada file js-nya.


Contoh kasus yang akan saya ambil adalah menghilangkan action archive/unarchive pada object mrp.bom, karena proses archiving nya tidak melalui fitur defaultnya odoo, tapi berdasarkan action button yang diklik oleh user yang memiliki akses.


1. Buat file form_controller.js dan list_controller.js dan tempatkan di dalam folder static/src/js di addons yang kita buat










2. Lakukan pemanggilan kedua file tersebut dengan mendefinisikannya di file xml, misalkan saya tempatkan di file template.xml dan pastikan file ini dipanggil juga di file __manifest__.py 

<odoo>
<data>

<template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script src="/aa_product_bom/static/src/js/list_controller.js" type="text/javascript"/>
<script src="/aa_product_bom/static/src/js/form_controller.js" type="text/javascript"/>
</xpath>
</template>

    </data>
</odoo>


3. Isikan file form_controller.js dengan coding berikut, untuk menghilangkan action archive/unarchive di tampilan form :

odoo.define('aa_product_bom.DisableArchiveOptionForm', function(require) {
"use strict";
var FormController = require('web.FormController');
var core = require('web.core');
var _t = core._t;

FormController.include({
_getActionMenuItems: function (state) {
if (!this.hasActionMenus || this.mode === 'edit') {
return null;
}
const props = this._super(...arguments);
const activeField = this.model.getActiveField(state);
const otherActionItems = [];
if (this.archiveEnabled && activeField in state.data && this.modelName != 'mrp.bom') {
if (state.data[activeField]) {
otherActionItems.push({
description: _t("Archive"),
callback: () => {
Dialog.confirm(this, _t("Are you sure that you want to archive this record?"), {
confirm_callback: () => this._toggleArchiveState(true),
});
},
});
} else {
otherActionItems.push({
description: _t("Unarchive"),
callback: () => this._toggleArchiveState(false),
});
}
}
if (this.activeActions.create && this.activeActions.duplicate) {
otherActionItems.push({
description: _t("Duplicate"),
callback: () => this._onDuplicateRecord(this),
});
}
if (this.activeActions.delete) {
otherActionItems.push({
description: _t("Delete"),
callback: () => this._onDeleteRecord(this),
});
}
return Object.assign(props, {
items: Object.assign(this.toolbarActions, { other: otherActionItems }),
});
},
});

});


4. Isikan file list_controller.js dengan coding berikut, untuk menghilangkan action archive/unarchive di tampilan tree :

odoo.define('aa_product_bom.DisableArchiveOption', function(require) {
"use strict";
var ListController = require('web.ListController');
var core = require('web.core');
var _t = core._t;

ListController.include({
_getActionMenuItems: function (state) {
if (!this.hasActionMenus || !this.selectedRecords.length) {
return null;
}
const props = this._super(...arguments);
const otherActionItems = [];
if (this.isExportEnable) {
otherActionItems.push({
description: _t("Export"),
callback: () => this._onExportData()
});
}
if (this.modelName != 'mrp.bom'){
if (this.archiveEnabled) {
otherActionItems.push({
description: _t("Archive"),
callback: () => {
Dialog.confirm(this, _t("Are you sure that you want to archive all the selected records?"), {
confirm_callback: () => this._toggleArchiveState(true),
});
}
}, {
description: _t("Unarchive"),
callback: () => this._toggleArchiveState(false)
});
}
}
if (this.activeActions.delete) {
otherActionItems.push({
description: _t("Delete"),
callback: () => this._onDeleteSelectedRecords()
});
}
return Object.assign(props, {
items: Object.assign({}, this.toolbarActions, { other: otherActionItems }),
context: state.getContext(),
domain: state.getDomain(),
isDomainSelected: this.isDomainSelected,
});
},
});

});

 

berikut ini hasilnya :















Terima kasih, semoga bermanfaat.

Kahfi

Wassalamu'alaikum Warohmatullah Wabarokatuh.