Hi Devs,
I am working on espo version 8.2.2.
I have a one to one relationship set up between a Device and Camera. When I replace the camera on the device I want to make the user set a reason for replacement which I'll then save into a device history table that I have created in the backend. I have a custom saver (eg FieldProcessing with a SaverInterface) set up that creates the device history records.
To make the user enter the replacement reason I have extended the views/modals/select-records view and instead of just closing it on select, I am opening a second modal which asks for a replacement reason (this is called in the select listener in setupList):
The second modal works and gets the reason.
But I have two problems - one is that I can't figure out how to pass the reason back to the parent view - I have done it here in the reasonModal function using
I can see the value in the parent view on the device model but it feels like a bad hack as it doesn't belong there.
The second is that even when I do that, the replacement reason is not on the entity when it gets to the saver in the back end. I suspect this is because it's not a real field on the entity as defined in entityDefs, but I can't find any way to pass extra data to the saver.
Does anyone know how I can pass the reason back to the parent view from the modal and then make it accessible in the saver in the back end?
Cheers,
Clare
I am working on espo version 8.2.2.
I have a one to one relationship set up between a Device and Camera. When I replace the camera on the device I want to make the user set a reason for replacement which I'll then save into a device history table that I have created in the backend. I have a custom saver (eg FieldProcessing with a SaverInterface) set up that creates the device history records.
To make the user enter the replacement reason I have extended the views/modals/select-records view and instead of just closing it on select, I am opening a second modal which asks for a replacement reason (this is called in the select listener in setupList):
Code:
define('custom:default-filter/select-mmx-camera', ['views/modals/select-records'], function (Dep) { return Dep.extend({ className: 'dialog dialog-record', backdrop: true, // 'static', true, false data: function () { var data = Dep.prototype.data.call(this); console.log('custom cam select data ',data); return data; }, setup: function () { Dep.prototype.setup.call(this); // par = this.getParentView().model; console.log(`my camera select.js this = `,this); }, setupList() { const viewName = this.getMetadata().get('clientDefs.' + this.scope + '.recordViews.listSelect') || this.getMetadata().get('clientDefs.' + this.scope + '.recordViews.list') || 'views/record/list'; const promise = this.createView('list', viewName, { collection: this.collection, fullSelector: this.containerSelector + ' .list-container', selectable: true, checkboxes: this.multiple, massActionsDisabled: true, rowActionsView: false, layoutName: this.layoutName, searchManager: this.searchManager, checkAllResultDisabled: !this.massRelateEnabled, buttonsDisabled: true, skipBuildRows: true, pagination: this.getMetadata().get(['clientDefs', this.scope, 'listPagination']) || null, }, view => { this.listenToOnce(view, 'select', model => { if ( model.get(`isInUse`) == 1 ) { Espo.Ui.error( `${model.get('name')} is attached to another Device. Please select another camera.`, true); } else { console.log(`in open reason modal`); this.reasonModal(model); } // this.trigger('select', model); // this.close(); }); const fetch = () => { this.whenRendered().then(() => { Espo.Ui.notify(' ... '); this.collection.fetch() .then(() => Espo.Ui.notify(false)); }); }; view.getSelectAttributeList(selectAttributeList => { if (!~selectAttributeList.indexOf('name')) { selectAttributeList.push('name'); } const mandatorySelectAttributeList = this.options.mandatorySelectAttributeList || this.mandatorySelectAttributeList || []; mandatorySelectAttributeList.forEach(attribute => { if (!~selectAttributeList.indexOf(attribute)) { selectAttributeList.push(attribute); } }); if (selectAttributeList) { this.collection.data.select = selectAttributeList.join(','); } fetch(); }); }); this.wait(promise); }, reasonModal: function (model) { this.createView('reasonModal', 'custom:service-replace-part-reason-dialog', { title: 'Add reason', }, view => { view.render(); view.listenToOnce(view, 'done', response => { console.log(`get parent view `,this.getParentView()); this.getParentView().model.set('replacementReason',response.replacementReason); // model.set('replacementReason',response.replacementReason); console.log(`reason response = `,model); this.trigger('select', model); this.close(); }) }); } }); });
But I have two problems - one is that I can't figure out how to pass the reason back to the parent view - I have done it here in the reasonModal function using
Code:
this.getParentView().model.set('replacementReason',response.replacementReason);
The second is that even when I do that, the replacement reason is not on the entity when it gets to the saver in the back end. I suspect this is because it's not a real field on the entity as defined in entityDefs, but I can't find any way to pass extra data to the saver.
Does anyone know how I can pass the reason back to the parent view from the modal and then make it accessible in the saver in the back end?
Cheers,
Clare