This is a continuation of the tutorial Control values of a multiple link field based on the values of another multiple link field posted here: https://forum.espocrm.com/forum/deve...-multiple-link
Step 4
Create script client/custom/src/views/modals/select-records-filtered.js using the code below:
Please note the line // console.log("select-records-filteres.js params = ",params); in the code above. This line can be un-commented for trouble shooting to display a message to the browser's console log indicating that the values provided in the script described in Step 2 were properly received.
Because of the limit of number of characters for a single post, this tutorial will continue in part 3 here https://forum.espocrm.com/forum/deve...p/60642-part-3
Step 4
Create script client/custom/src/views/modals/select-records-filtered.js using the code below:
Code:
define('custom:views/modals/select-records-filtered', ['views/modals/select-records', 'search-manager'], function (Dep, SearchManager) { return Dep.extend({ setup: function () { this.filters = this.options.filters || {}; this.boolFilterList = this.options.boolFilterList || []; this.primaryFilterName = this.options.primaryFilterName || null; if ('multiple' in this.options) { this.multiple = this.options.multiple; } if ('createButton' in this.options) { this.createButton = this.options.createButton; } this.massRelateEnabled = this.options.massRelateEnabled; this.buttonList = [ { name: 'cancel', label: 'Cancel' } ]; if (this.multiple) { this.buttonList.unshift({ name: 'select', style: 'danger', label: 'Select', disabled: true, onClick: function (dialog) { var listView = this.getView('list'); if (listView.allResultIsChecked) { var where = this.collection.where; this.trigger('select', { massRelate: true, where: where }); } else { var list = listView.getSelected(); if (list.length) { this.trigger('select', list); } } dialog.close(); }.bind(this), }); } this.scope = this.entityType = this.options.scope || this.scope; if (this.noCreateScopeList.indexOf(this.scope) !== -1) { this.createButton = false; } if (this.createButton) { if (!this.getAcl().check(this.scope, 'create') || this.getMetadata().get(['clientDefs', this.scope, 'createDisabled'])) { this.createButton = false; } } this.headerHtml = ''; var iconHtml = this.getHelper().getScopeColorIconHtml(this.scope) ; this.headerHtml += this.translate('Select') + ': '; this.headerHtml += this.getLanguage().translate(this.scope, 'scopeNamesPlural'); this.headerHtml = iconHtml + this.headerHtml; this.waitForView('list'); if (this.searchPanel) { this.waitForView('search'); } // get the link filter values from the scope clientDefs const modelTable = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','modelTable']); const modelCriteriaTable = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','modelCriteriaTable']); const criteriaTable = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','criteriaTable']); const criteriaTargetTable = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','criteriaTargetTable']); const targetTable = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','targetTable']); const modelKey = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','modelKey']); const modelReferenceKey = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','modelReferenceKey']); const criteriaKey = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','criteriaKey']); const criteriaReferenceKey = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','criteriaReferenceKey']); const targetKey = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','targetKey']); const targetReferenceKey = this.getMetadata().get(['clientDefs', this.scope, 'linkFilter','targetReferenceKey']); // use plain ajax to invoke an entry point that will call a Service to return a list to use as a filter for the records available for selection var url = '?entryPoint=conditionalLinkMultiple'; var params = { action: 'getOptionListFilter', modelKeyValue: this.options.parentId, modelTable: modelTable, modelCriteriaTable: modelCriteriaTable, criteriaTable: criteriaTable, criteriaTargetTable: criteriaTargetTable, targetTable: targetTable, modelKey: modelKey, modelReferenceKey: modelReferenceKey, criteriaKey: criteriaKey, criteriaReferenceKey: criteriaReferenceKey, targetKey: targetKey, targetReferenceKey: targetReferenceKey }; // console.log("select-records-filteres.js params = ",params); var self = this; var payload = JSON.stringify(params); var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", url); xmlhttp.setRequestHeader("Content-type", "application/json"); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState === XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4 if (xmlhttp.status === 200) { var filterList = JSON.parse(xmlhttp.responseText); self.getCollectionFactory().create(self.scope, function (collection) { collection.maxSize = self.getConfig().get('recordsPerPageSmall') || 5; collection.whereAdditional = [ { field: 'id', type: 'in', value: filterList } ]; self.collection = collection; if (self.defaultOrderBy) { self.collection.setOrder(self.defaultOrderBy, self.defaultOrder || false, true); } self.loadSearch(); self.wait(true); self.loadList(); }, self); } else if (xmlhttp.status === 400) { alert('There was an error 400 at select-records-filtered.js'); } else { alert('something else other than 200 was returned at select-records-filtered.js'); } } }; xmlhttp.send(payload); } }); });
Because of the limit of number of characters for a single post, this tutorial will continue in part 3 here https://forum.espocrm.com/forum/deve...p/60642-part-3