Personalizzazione comportamento tree view
Il nostro problema è questo: abbiamo tre tabelle, da sinistra a destra le tabelle sono a cascata, quindi un Valore ha un m2o ad un Attributo, ed una Localizzazione ha un m2o ad un Valore.
Abbiamo messo l'icona check su Attributo e Valore per selezionare a cascata i record della tabella successiva, ma abbiamo dei problemi per quanto riguarda l'usabilità:
- Quando aggiungo un record sulla tabella Attributo, non posso selezionarlo a meno che non salvo il record, questo significa che se voglio aggiungere tante righe devo fare ogni volta un salvataggio e perdo tempo, vorremmo poter salvare direttamente i record in maniera da non dover fare avanti e indietro tra Salva e Modifica
4 Replies
@Francesco Ballerini sposta pure qui il messaggio
Se non riesci a uscirne lato python puoi sempre chiamare il saveRecord lato JS.
Ti serve un onchange sulla vista per impostare a True un flag e rilevare quando il check è selezionato.
Se fai amicizia con "js_class" e lo metti sul one2many (penso si possa fare) ti allacci al controller JS specifico che "bindi" con quella view. C'è tutto sulla doc. https://www.odoo.com/documentation/14.0/developer/reference/javascript/javascript_cheatsheet.html#customizing-an-existing-view
Metti un event handler sul bottone, impostando lato xml una classe come selettore, poi definisci l'evento lato js
events: _.extend({}, MyController.prototype.events, {
'click .my_selector': '_onCheckBtnClick ',
}),
Per l'handler '_onCheckBtnClick' vedi il codice nel messaggio sotto, aggiornato e corretto a livello di sintassi
Importante, il bottone definito lato xml NON deve avere type="object" e nemmeno type="action", altrimenti non fa la call in JS
Se riuscite a fare l'equivalente usando solo python fateci sapereChe casino comunque, vediamo di uscirne fuori
E facendo così:
https://www.cybrosys.com/blog/customizing-an-existing-view-type-in-odoo-14
Qui c'è l'esempio per la kanban view
E' la stessa identica cosa che dicevo di fare io, cioè estendere una view esistente, in questo caso tree-view, creandone una copia e associandovi un controller custom (su cui puoi fare un bind dell'evento click tramite class selector sul bottone, e poi associarvi un handler). Per specificare di usare il tuo JS custom invece che il JS nativo, sul one2many metti "js_class". Nulla di diverso rispetto alla soluzione proposta sopra, con la differenza che ti ho già scritto l'handler, però ti confermo che la soluzione è quella
__
Ti risposto il codice dell'handler perché girandolo su Odoo dava errori di sintassi, in quanto l'ho preso da mio codice e riadattato leggermente alla tua situazione ma senza testarlo nello specifico. Gli errori di sintassi però li ho corretti, è possibile che ci sia qualcosa da riadattare a livello di logica ovviamente, ma in sostanza dovrebbe girare , lo riposto qui perché sopra non ho più caratteri a disposizione
_onClickSetupConfirm: function (ev) {
var record = this.model.get(this.handle);
var self = this;
if (record.data.is_checked === true) {
// se è checckato salvo il record poi chiamo python per praticità, in caso
// devo fare altre operazioni
var def = this.saveRecord(this.handle, {
stayInEdit: true,
}).then(function (result){
var record = self.model.get(self.handle);
self._rpc({
model: 'modello.col.bottone',
method: 'metodo_del_bottone',
kwargs: {arg1: record.data.field_a_caso},
}).then(function (res) {
// togli questa parte se non devi fare ulteriori operazioni post-python
return res;
});
});
} else {
// però poi devi cancellare il record se toglie il check.
// E' possibile che debba prima inserire un controllo per
// vedere se il record è effettivamente cancellabile (presente nel db)
this._deleteRecords(this.handle);
}
return def;
},
Come dicevo, è la stessa cosa che ti linkavo qui https://www.odoo.com/documentation/14.0/developer/reference/javascript/javascript_cheatsheet.html#customizing-an-existing-view
Solo che cybrosys la spiega un pò più in dettaglio, ma è la stessa identica soluzione con js_class.
In quel modo puoi intercettare il click e chiamare del JS sulla tua view specifica, senza impattare sul codice nativo perché SOLO quella view userà QUEL controller.
Mi viene solo il dubbio che si possa mettere un js_class attributo sui fields one2many/many2many, ma direi che si possa fare senza problemi