Formulário e lista de anexos do InforCRM

As personalizações do formulário de anexo (na versão 8.1+) precisam ser realizadas em Javascript. Ao usar a técnica “monkey patch”, as personalizações podem ser discretas e (relativamente) seguras para atualização – faz uso de métodos privados e detalhes de implementação, mas não requer a modificação dos arquivos de estoque. Usando aspect.after, também é possível ter vários módulos personalizando o formulário / grade de forma independente. Meu colega de trabalho Adam e eu sugerimos o seguinte para um cliente:

Aqui está como adicionar uma nova coluna:

//add the document type column to the grid and the sdata query
aspect
.after(AttachmentList.prototype, 'onBeforeCreateGrid', function (options) {
options
.columns.push({
field
: "documentType",
name
: "Doc Type",
sortable
: true,
// Optionally, provide custom filter configuration
// This can make use of custom made widgets
// filterConfig: {
// widgetType: PickListFilterWidget,
// label: 'Document Type'
// }
});

options
.storeOptions.select.push("documentType");
}, true);

Personalizações para o formulário de edição são um pouco mais envolvidos, mas podemos tirar proveito de um gancho fornecido pela Infor: onDescriptionsEntered. Os controles estão alguns pixels fora, a menos que você se aprofunde no interior da classe DescriptionsForm (que eu queria evitar para ficar mais seguro com a atualização) ou gaste um pouco de tempo mexendo no CSS.

//add the form parts for the document type drop down to the attachment details screen when a new attachment is uploaded
aspect
.after(DescriptionsForm.prototype, '_addFormParts', function () {

for (var i = 0; i < this.files.length; i++) {

var file = this.files[i];

var contentPane = new dijit.layout.ContentPane({
id
: 'panAttachmentAdditionalFields_' + i,
content
: '<div class="attachment-additional-fields">' +
'<div style="float: left; width: 50%"><label>Document Type:</label><br/><input type="text" class="txtDocumentType"/></div>' +
'<div style="float: left; width: 50%"><label>Private?<input type="checkbox" class="chkPrivate"/></label></div>' +
'</div>'
});
var docTypeFld = new SingleSelectPickList({
id
: 'docType_' + i,
value: '',
pickListName
: 'Attachment Type'
}, contentPane.domNode.querySelector('input.txtDocumentType'));
var chkPrivate = new CheckBox({
id
: 'chkPrivate_' + i
}, contentPane.domNode.querySelector('input.chkPrivate'));
this.contentNode.addChild(contentPane);

// Note that we do NOT add the fields to the form parts.
// this is because clearForm is called before onDescriptionsEntered, thus would make it impossible to retrieve the control values.
// this._formParts.push(contentPane);
}
});

//hijack the onDescriptionsEntered function to pull out the values from the documentType drop down
DescriptionsForm.prototype.onDescriptionsEntered = function (files, descriptions) {
for (var i = 0; i < descriptions.length; i++) {
descriptions
[i].documentType = dijit.byId('docType_' + i).get('value');
if(!descriptions[i].details)
descriptions
[i].details = {};
descriptions
[i].details.isPrivate = dijit.byId('chkPrivate_' + i).get('value') == "on";
descriptions
[i].details.importSource = 'Attachment Tab';
dijit
.byId('panAttachmentAdditionalFields_' + i).destroyRecursive();
}
};

Isso será encerrado em uma requirechamada, algo como:

require(["dojo/aspect",
"Sage/UI/AttachmentList",
'Sage/UI/Controls/SingleSelectPickList',
'dijit/form/CheckBox',
'Sage/Utility/File/DescriptionsForm'],
function(aspect, AttachmentList, SingleSelectPickList, CheckBox, DescriptionsForm) {
// ...
}