In this example https://academy.creatio.com/documents/technic-sdk/7-15/handling-selection-several-records-examples there is a mention about method to open a lookup in the Case 2 example as
this.openLookup(config, this.lookupCallback, this);
similary is there a method to open up a pre-configured page to get some inputs and the inputs are then used in the multiselect records?
Like
Sriraksha KS,
1. The schema resources should be added to the dependencies. For example:
define("ActivitySectionV2", ["ConfigurationConstants", "ActivitySectionV2Resources"],
function(ConfigurationConstants, resources) {...}
2. UsrContact /UsrAccount fields are just attributes of inputBox page. They are not presented in the database.
Please feel free to see the full example below:
define("ActivitySectionV2", ["ConfigurationConstants", "ActivitySectionV2Resources"], function(ConfigurationConstants, resources) { return { // Section schema name. entitySchemaName: "Activity", // Section view model methods. methods: { // Defines if the menu option is enabled. isCustomActionEnabled: function() { // Attempt to receive the selected record indentifier array var selectedRows = this.get("SelectedRows"); // If the array contains some elements (at least one of the records is selected from the list), // it returns true, otherwise — false. return selectedRows ? (selectedRows.length > 0) : false; }, openInputBox: function() { this.set("UsrContactCollection", new Terrasoft.Collection()); this.set("UsrAccountCollection", new Terrasoft.Collection()); this.set("UsrContact", null); this.set("UsrAccount", null); var controls = { "UsrContact": { dataValueType: Terrasoft.DataValueType.ENUM, isRequired: true, caption: resources.localizableStrings.UsrContactCaption, value: { bindTo: "UsrContact" }, customConfig: { tag: "Contact", list: { bindTo: "UsrContactCollection" }, prepareList: { bindTo: "getCollectionValues" }, loadNextPage: { bindTo: "loadCollectionNextPage" } } }, "UsrAccount": { dataValueType: Terrasoft.DataValueType.ENUM, isRequired: true, caption: resources.localizableStrings.UsrAccountCaption, value: { bindTo: "UsrAccount" }, customConfig: { tag: "Account", list: { bindTo: "UsrAccountCollection" }, prepareList: { bindTo: "getCollectionValues" }, loadNextPage: { bindTo: "loadCollectionNextPage" } } } }; Terrasoft.utils.inputBox(resources.localizableStrings.UsrInputBoxCaption, this.openInputBoxHandler, [Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL], this, controls ); Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item) { item.control.bind(this); }, this); }, getCollectionValues: function(filter, list, tag) { if (Ext.isEmpty(list)) { return; } list.clear(); var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: tag, isPageable: true, rowCount: 20 }); this.buildCollectionQuery(esq, list, filter, tag); }, loadCollectionNextPage: function(listParams, tag) { if (!this.get("CanLoadMore" + tag)) { return; } var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: tag, isPageable: true, rowCount: 20, rowsOffset: listParams.listView.collectionItemsCount }); this.buildCollectionQuery(esq, listParams.list, listParams.filterValue, tag); }, buildCollectionQuery: function(esq, list, filter, tag) { esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "value"); var orderColumn = esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "displayValue"); orderColumn.orderDirection = Terrasoft.OrderDirection.ASC; esq.filters.addItem(esq.createPrimaryDisplayColumnFilterWithParameter( Terrasoft.ComparisonType.START_WITH, filter, Terrasoft.DataValueType.TEXT)); esq.getEntityCollection(function(response) { if (response && response.success) { var preObject = {}; response.collection.each(function(item) { preObject[item.get("value")] = item.values; }, this); list.loadAll(preObject); this.set("CanLoadMore" + tag, response.collection.getCount() === 20); } }, this); }, openInputBoxHandler: function(returnCode, controlData) { if (Terrasoft.MessageBoxButtons.OK.returnCode === returnCode) { console.log("it works"); const activeRowId = controlData.UsrContact.value.value; // Receiving of the selected record identifier array. var selectedRows = this.get("SelectedRows"); // The procession starts if at least one record is selected from the list and the owner is selected // in the lookup. if ((selectedRows.length > 0)) { // Creation of the batch query class instance. var batchQuery = this.Ext.create("Terrasoft.BatchQuery"); // Update of each selected record. selectedRows.forEach(function(selectedRowId) { // Creation of the UpdateQuery class instance with the Activity root schema. var update = this.Ext.create("Terrasoft.UpdateQuery", { rootSchemaName: "Activity" }); // Applying filter to determine the record for update. update.enablePrimaryColumnFilter(selectedRowId); // The [Owner] column is populated with the value that equals to // the lookup selected contact id. update.setParameterValue("Owner", activeRowId, this.Terrasoft.DataValueType.GUID); // Adding a record update query to the batch query. batchQuery.add(update); }, this); // Batch query to the server. batchQuery.execute(function() { // Record list update. this.reloadGridData(); }, this); } // TODO: your code here } }, // Overriding the base virtual method, returning the section action collection. getSectionActions: function() { // Calling of the parent method implementation, // returning the initialized section action collection. var actionMenuItems = this.callParent(arguments); // Adding separator line. actionMenuItems.addItem(this.getButtonMenuItem({ Type: "Terrasoft.MenuSeparator", Caption: "" })); // Adding a menu option to the section action list. actionMenuItems.addItem(this.getButtonMenuItem({ // Binding the menu option title to the localized schema string. "Caption": { bindTo: "Resources.Strings.SetOwnerCaption" }, // Binding of the action handler method. "Click": { bindTo: "openInputBox" }, // Binding the menu option enable property to the value that returns the isCustomActionEnabled method. "Enabled": { bindTo: "isCustomActionEnabled" }, // Multiselection mode enabling. "IsEnabledForSelectedAll": true })); // Returning of the added section action collection. return actionMenuItems; } } }; });
As I understood, you want to open a pre-configured page to select a value instead of the lookup page. Please correct me if I am wrong.
I suppose you can just create a new lookup with needed fields. That allows you to use the out-of-the box functionality without additional development. Please see the article on Academy:
https://academy.creatio.com/documents/administration/7-15/creating-and-registering-lookups
Could you please clarify your business task? Why the lookup page is not appropriate for you?
However you can take a look at the LookupUtilitiesV2 schema and investigate how the open method works - https://prnt.sc/rhlzfr .
Alina Kazmirchuk,
Dear Alina, The use case is to get multiple values to be assigned for the records instead of just one. Ex., For the selected records would like to setup the owner and also the due date. So if we are able to open up a page which has a date and owner lookup field. Then using that page, the date and owner can be read and updated into each of the records. Hope it is clear now?
Thanks a lot Alina. This will work. Will try it out and let you know.
Ganesh Babu,
Thank you so much for explanation. I can recommend you to use the inputBox for that.
There is an example how to open the inputBox with Account and Contact lookup fields. Add code below into methods section and bind openInputBox method.
Please see the result here -> https://prnt.sc/rhntk5
openInputBox: function() { this.set("UsrContactCollection", new Terrasoft.Collection()); this.set("UsrAccountCollection", new Terrasoft.Collection()); this.set("UsrContact", null); this.set("UsrAccount", null); var controls = { "UsrContact": { dataValueType: Terrasoft.DataValueType.ENUM, isRequired: true, caption: resources.localizableStrings.UsrContactCaption, value: { bindTo: "UsrContact" }, customConfig: { tag: "Contact", list: { bindTo: "UsrContactCollection" }, prepareList: { bindTo: "getCollectionValues" }, loadNextPage: { bindTo: "loadCollectionNextPage" } } }, "UsrAccount": { dataValueType: Terrasoft.DataValueType.ENUM, isRequired: true, caption: resources.localizableStrings.UsrAccountCaption, value: { bindTo: "UsrAccount" }, customConfig: { tag: "Account", list: { bindTo: "UsrAccountCollection" }, prepareList: { bindTo: "getCollectionValues" }, loadNextPage: { bindTo: "loadCollectionNextPage" } } } }; Terrasoft.utils.inputBox(resources.localizableStrings.UsrInputBoxCaption, this.openInputBoxHandler, [Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL], this, controls ); Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item) { item.control.bind(this); }, this); }, getCollectionValues: function(filter, list, tag) { if (Ext.isEmpty(list)) { return; } list.clear(); var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: tag, isPageable: true, rowCount: 20 }); this.buildCollectionQuery(esq, list, filter, tag); }, loadCollectionNextPage: function(listParams, tag) { if (!this.get("CanLoadMore" + tag)) { return; } var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: tag, isPageable: true, rowCount: 20, rowsOffset: listParams.listView.collectionItemsCount }); this.buildCollectionQuery(esq, listParams.list, listParams.filterValue, tag); }, buildCollectionQuery: function(esq, list, filter, tag) { esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "value"); var orderColumn = esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "displayValue"); orderColumn.orderDirection = Terrasoft.OrderDirection.ASC; esq.filters.addItem(esq.createPrimaryDisplayColumnFilterWithParameter( Terrasoft.ComparisonType.START_WITH, filter, Terrasoft.DataValueType.TEXT)); esq.getEntityCollection(function(response) { if (response && response.success) { var preObject = {}; response.collection.each(function(item) { preObject[item.get("value")] = item.values; }, this); list.loadAll(preObject); this.set("CanLoadMore" + tag, response.collection.getCount() === 20); } }, this); }, openInputBoxHandler: function(returnCode, controlData) { if (Terrasoft.MessageBoxButtons.OK.returnCode === returnCode) { // TODO: your code here } }
Alina Kazmirchuk,
Thank you for the code Alina. Even I have this requirement for our customer.
I tried with this code, it says issue with Resources.
Whats is the dependency to be mentioned in dependencies for
resources.localizableStrings
UsrContact /UsrAccount is Entity Column name Or Its a Attribute?
It would help us if you provide us with the full code with instructions.
Thank you in advance
Sriraksha
Sriraksha KS,
1. The schema resources should be added to the dependencies. For example:
define("ActivitySectionV2", ["ConfigurationConstants", "ActivitySectionV2Resources"],
function(ConfigurationConstants, resources) {...}
2. UsrContact /UsrAccount fields are just attributes of inputBox page. They are not presented in the database.
Please feel free to see the full example below:
define("ActivitySectionV2", ["ConfigurationConstants", "ActivitySectionV2Resources"], function(ConfigurationConstants, resources) { return { // Section schema name. entitySchemaName: "Activity", // Section view model methods. methods: { // Defines if the menu option is enabled. isCustomActionEnabled: function() { // Attempt to receive the selected record indentifier array var selectedRows = this.get("SelectedRows"); // If the array contains some elements (at least one of the records is selected from the list), // it returns true, otherwise — false. return selectedRows ? (selectedRows.length > 0) : false; }, openInputBox: function() { this.set("UsrContactCollection", new Terrasoft.Collection()); this.set("UsrAccountCollection", new Terrasoft.Collection()); this.set("UsrContact", null); this.set("UsrAccount", null); var controls = { "UsrContact": { dataValueType: Terrasoft.DataValueType.ENUM, isRequired: true, caption: resources.localizableStrings.UsrContactCaption, value: { bindTo: "UsrContact" }, customConfig: { tag: "Contact", list: { bindTo: "UsrContactCollection" }, prepareList: { bindTo: "getCollectionValues" }, loadNextPage: { bindTo: "loadCollectionNextPage" } } }, "UsrAccount": { dataValueType: Terrasoft.DataValueType.ENUM, isRequired: true, caption: resources.localizableStrings.UsrAccountCaption, value: { bindTo: "UsrAccount" }, customConfig: { tag: "Account", list: { bindTo: "UsrAccountCollection" }, prepareList: { bindTo: "getCollectionValues" }, loadNextPage: { bindTo: "loadCollectionNextPage" } } } }; Terrasoft.utils.inputBox(resources.localizableStrings.UsrInputBoxCaption, this.openInputBoxHandler, [Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL], this, controls ); Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item) { item.control.bind(this); }, this); }, getCollectionValues: function(filter, list, tag) { if (Ext.isEmpty(list)) { return; } list.clear(); var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: tag, isPageable: true, rowCount: 20 }); this.buildCollectionQuery(esq, list, filter, tag); }, loadCollectionNextPage: function(listParams, tag) { if (!this.get("CanLoadMore" + tag)) { return; } var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: tag, isPageable: true, rowCount: 20, rowsOffset: listParams.listView.collectionItemsCount }); this.buildCollectionQuery(esq, listParams.list, listParams.filterValue, tag); }, buildCollectionQuery: function(esq, list, filter, tag) { esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "value"); var orderColumn = esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "displayValue"); orderColumn.orderDirection = Terrasoft.OrderDirection.ASC; esq.filters.addItem(esq.createPrimaryDisplayColumnFilterWithParameter( Terrasoft.ComparisonType.START_WITH, filter, Terrasoft.DataValueType.TEXT)); esq.getEntityCollection(function(response) { if (response && response.success) { var preObject = {}; response.collection.each(function(item) { preObject[item.get("value")] = item.values; }, this); list.loadAll(preObject); this.set("CanLoadMore" + tag, response.collection.getCount() === 20); } }, this); }, openInputBoxHandler: function(returnCode, controlData) { if (Terrasoft.MessageBoxButtons.OK.returnCode === returnCode) { console.log("it works"); const activeRowId = controlData.UsrContact.value.value; // Receiving of the selected record identifier array. var selectedRows = this.get("SelectedRows"); // The procession starts if at least one record is selected from the list and the owner is selected // in the lookup. if ((selectedRows.length > 0)) { // Creation of the batch query class instance. var batchQuery = this.Ext.create("Terrasoft.BatchQuery"); // Update of each selected record. selectedRows.forEach(function(selectedRowId) { // Creation of the UpdateQuery class instance with the Activity root schema. var update = this.Ext.create("Terrasoft.UpdateQuery", { rootSchemaName: "Activity" }); // Applying filter to determine the record for update. update.enablePrimaryColumnFilter(selectedRowId); // The [Owner] column is populated with the value that equals to // the lookup selected contact id. update.setParameterValue("Owner", activeRowId, this.Terrasoft.DataValueType.GUID); // Adding a record update query to the batch query. batchQuery.add(update); }, this); // Batch query to the server. batchQuery.execute(function() { // Record list update. this.reloadGridData(); }, this); } // TODO: your code here } }, // Overriding the base virtual method, returning the section action collection. getSectionActions: function() { // Calling of the parent method implementation, // returning the initialized section action collection. var actionMenuItems = this.callParent(arguments); // Adding separator line. actionMenuItems.addItem(this.getButtonMenuItem({ Type: "Terrasoft.MenuSeparator", Caption: "" })); // Adding a menu option to the section action list. actionMenuItems.addItem(this.getButtonMenuItem({ // Binding the menu option title to the localized schema string. "Caption": { bindTo: "Resources.Strings.SetOwnerCaption" }, // Binding of the action handler method. "Click": { bindTo: "openInputBox" }, // Binding the menu option enable property to the value that returns the isCustomActionEnabled method. "Enabled": { bindTo: "isCustomActionEnabled" }, // Multiselection mode enabling. "IsEnabledForSelectedAll": true })); // Returning of the added section action collection. return actionMenuItems; } } }; });
Alina Kazmirchuk,
Thank you Alina, Will try this out.
Regards,
Sriraksha
Alina Kazmirchuk,
Thank you for the solution. I have a doubt, In select rows, it returns only Id, Is there a way where i can take Name?
isCustomActionEnabled: function() { // Attempt to receive the selected record indentifier array var selectedRows = this.get("SelectedRows"); // If the array contains some elements (at least one of the records is selected from the list), // it returns true, otherwise — false. return selectedRows ? (selectedRows.length > 0) : false; },
Please help on this, i tried using ESQ , even though i got record using, i was not able to use it in next code in Section. If it was in Page i would have used Attribute . but, here I am stuck .
Please help.
openInputBoxHandler: function(returnCode, controlData) {
if (Terrasoft.MessageBoxButtons.OK.returnCode === returnCode) {
const activeRowId = controlData.UsrContact.value.value;
var selectedRows = this.get("SelectedRows");
this.set("AccName", null);
if ((selectedRows.length > 0)) {
var batchQuery = this.Ext.create("Terrasoft.BatchQuery");
selectedRows.forEach(function(selectedRowId) {
/* var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Account"
});
esq.addColumn("Id");
esq.addColumn("Name" );
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"Id", selectedRowId );
esq.filters.add("esqFirstFilter", esqFirstFilter);
var e = esq.getEntityCollection();
esq.getEntityCollection(function (result) {
if (result.success) {
result.collection.each(function (item) {
this.set("AccName",item.get("Name"));
});
}
this.showInformationDialog("Data query error");
}, this);*/
var insert = Ext.create("Terrasoft.InsertQuery", {
rootSchemaName: "Activity"
});
insert.setParameterValue("Title", "Visit Account " , Terrasoft.DataValueType.TEXT);
insert.setParameterValue("StartDate", new Date(),
Terrasoft.DataValueType.DATE);
insert.setParameterValue("DueDate", controlData.UsrDueDate.value,
Terrasoft.DataValueType.DATE);
insert.setParameterValue("ActivityCategory", "F51C4643-58E6-DF11-971B-001D60E938C6",
Terrasoft.DataValueType.GUID);
insert.setParameterValue("Status", "384D4B84-58E6-DF11-971B-001D60E938C6",
Terrasoft.DataValueType.GUID);
insert.setParameterValue("Owner", activeRowId,
Terrasoft.DataValueType.GUID);
insert.setParameterValue("Account", selectedRowId,
Terrasoft.DataValueType.GUID);
batchQuery.add(insert);
}, this);
//batchQuery.execute();
batchQuery.execute(function() {
this.reloadGridData();
}, this);
}
}
},
Alina Kazmirchuk,
Can the controls in the openInputBox be disabled? What is the property used for it.
I used "enabled : false"
"UsrQuestion": {
dataValueType: Terrasoft.DataValueType.TEXT,
isRequired: true,
caption: resources.localizableStrings.UsrQuestionCaption,
value: {
bindTo: "UsrQuestion",
enabled: false
},
}
But dint work. Can you please help .
Alina Kazmirchuk,
How can we apply filter in
"UsrContact": { dataValueType: Terrasoft.DataValueType.ENUM, isRequired: true, caption: resources.localizableStrings.UsrContactCaption, value: { bindTo: "UsrContact" }, customConfig: { tag: "Contact", list: { bindTo: "UsrContactCollection" }, prepareList: { bindTo: "getCollectionValues" }, loadNextPage: { bindTo: "loadCollectionNextPage" } } }, say I want to filter only customer type contacts. Please help how to pass filter attribute here.
Thanks,
Sriraksha