Hi Creatio Community,
I've been trying to create custom Actions dropdown button (not FreedomUI) and I can't seem to be able to find working documentation for it or get something similar to it. Would like your help for it.
Here are a couple of documentations I've tried out (First one is not working while the second one isn't exactly what we want):
1. https://community.creatio.com/questions/add-custom-buttons-actionbutton…
2. https://community.creatio.com/articles/how-create-and-popualte-drop-dow…
Thanks in advance.
Regards,
Abilash.S
Like
Abilash,
Hi,
The task is to copy the logic of the existing "Actions" button and apply the same to the custom button. To do that (tested in the "Opportunity" section):
1) In the OpportunitySectionV2 section schema:
1.1) Add the CombinedModeCustomActionsButtonMenuItems attribute of the "Collection" dataValueType (Terrasoft.DataValueType.COLLECTION). The example is CombinedModeActionsButtonMenuItems from BaseDataView.
1.2) Create a PTP "GetCardActionsCustom" message with the SUBSCRIBE direction (as done on the BasePageV2)
1.3) In the subscribeSandboxEvents method subscribe to the "GetCardActionsCustom" message and trigger the initCustomActionButtonMenu method when the "GetCardActionsCustom" message is received (as done for the "GetCardActions" message on the BasePageV2)
1.4) Create an extension of the _initCollections method (as done for the basic "Actions" button)
1.5) Add an empty prepareCustomActionsButtonMenuItems function to methods (as done for prepareActionsButtonMenuItems method in BaseDataView)
1.6) Add the initCustomActionButtonMenu method which is a handler for the "GetCardActionsCustom" message (as done with the initActionButtonMenu method from BaseDataView).
1.7) Add the button itself to the diff array
The complete schema of OpportunitySectionV2:
define("OpportunitySectionV2", [], function() { return { entitySchemaName: "Opportunity", attributes: { "CombinedModeCustomActionsButtonMenuItems": { dataValueType: Terrasoft.DataValueType.COLLECTION } }, messages: { "GetCardActionsCustom": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.SUBSCRIBE } }, details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/, diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "name": "CustomActionsButton", "parentName": "CombinedModeActionButtonsCardLeftContainer", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "caption": {"bindTo": "Resources.Strings.CustomActionsButtonCaption"}, "classes": { "textClass": ["actions-button-margin-right"], "wrapperClass": ["actions-button-margin-right"] }, "prepareMenu": {"bindTo": "prepareCustomActionsButtonMenuItems"}, "menu": {"items": {"bindTo": "CombinedModeCustomActionsButtonMenuItems"}} } }, ]/**SCHEMA_DIFF*/, methods: { subscribeSandboxEvents: function() { this.callParent(arguments); const cardModuleSandboxId = this.getCardModuleSandboxId(); this.sandbox.subscribe("GetCardActionsCustom", function(actionMenuItems) { this.initCustomActionButtonMenu("Combined", actionMenuItems); }, this, [cardModuleSandboxId]); }, prepareCustomActionsButtonMenuItems: Ext.emptyFn, _initCollections: function() { this.callParent(arguments); this.set("CombinedModeCustomActionsButtonMenuItems", this.Ext.create("Terrasoft.BaseViewModelCollection")); }, initCustomActionButtonMenu: function(modeType, actionMenuItems) { const collectionName = modeType + "ModeCustomActionsButtonMenuItems"; const collection = this.get(collectionName); if (actionMenuItems.getCount()) { this.set(modeType + "ModeActionsButtonVisible", true); const newCollection = this.Ext.create("Terrasoft.BaseViewModelCollection"); actionMenuItems.each(function(item) { newCollection.addItem(item); }, this); if (collection) { collection.clear(); collection.loadAll(newCollection); } else { this.set(collectionName, newCollection); } } else { this.set(modeType + "ModeActionsButtonVisible", false); } }, } }; });
2) In OpportunityPageV2:
2.1) Create the "GetCardActionsCustom" message (as done for the "GetCardActions" existing message)
2.2) In the init method call the initCustomActionButtonMenu method
2.3) Create the initCustomActionButtonMenu method (as done for the initActionButtonMenu in BasePageV2)
2.4) Create the getCustomActions method (as done with the getActions method in the basic OpportunityPageV2 with only difference that you don't need to call parent method but create an instance of the Terrasoft.BaseViewModelCollection here)
2.5) Add the button itself to the diff array
The complete code is:
define("OpportunityPageV2", [], function() { return { entitySchemaName: "Opportunity", attributes: {}, messages: { "GetCardActionsCustom": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.PUBLISH } }, modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/, details: /**SCHEMA_DETAILS*/{ "UsrSchemaf6483d73Detaile560e0a4": { "schemaName": "UsrSchemaf6483d73Detail", "entitySchemaName": "UsrOppTestDet", "filter": { "detailColumn": "UsrOpportunity", "masterColumn": "Id" } } }/**SCHEMA_DETAILS*/, businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/, methods: { init: function() { this.callParent(arguments); this.initCustomActionButtonMenu(); }, initCustomActionButtonMenu: function() { this.publishPropertyValueToSection("IsCardInEditMode", this.isEditMode()); var actionMenuItems = this.getCustomActions(); var actionsButtonVisible = !actionMenuItems.isEmpty(); this.set("CustomActionsButtonVisible", actionsButtonVisible); this.set("CustomActionsButtonMenuItems", actionMenuItems); this.sandbox.publish("GetCardActionsCustom", actionMenuItems, [this.sandbox.id]); }, getCustomActions: function() { var actionMenuItems = this.Ext.create("Terrasoft.BaseViewModelCollection"); actionMenuItems.addItem(this.getButtonMenuItem({ "Caption": {"bindTo": "Resources.Strings.CustomButtonCaption"}, "Tag": "clickCustomButton" })); return actionMenuItems; } }, dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/, diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "parentName": "LeftContainer", "propertyName": "items", "name": "actions", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "caption": {"bindTo": "Resources.Strings.CustomButtonCaption"}, "classes": { "textClass": ["actions-button-margin-right"], "wrapperClass": ["actions-button-margin-right"] }, "menu": { "items": {"bindTo": "CustomActionsButtonMenuItems"} }, "visible": {"bindTo": "CustomActionsButtonVisible"} } }, { "operation": "merge", "name": "MetricsContainer", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 0 } } }, { "operation": "merge", "name": "OpportunityClient", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 1 } } }, { "operation": "remove", "name": "OpportunityClient", "properties": [ "tip" ] }, { "operation": "merge", "name": "LablelMetricsContainer", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 2 } } }, { "operation": "merge", "name": "BantProfileHeaderContainer", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 0 } } }, { "operation": "merge", "name": "BantIcon", "values": { "layout": { "colSpan": 5, "rowSpan": 1, "column": 0, "row": 0 } } }, { "operation": "merge", "name": "BantHeaderCaption", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 5, "row": 0 } } }, { "operation": "merge", "name": "OpportunityBudget", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 1 } } }, { "operation": "merge", "name": "OpportunityDecisionMaker", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 2 } } }, { "operation": "merge", "name": "OpportunityLeadType", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 3 } } }, { "operation": "move", "name": "OpportunityLeadType", "parentName": "BantProfile", "propertyName": "items", "index": 3 }, { "operation": "merge", "name": "OpportunityDueDate", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 4 } } }, { "operation": "merge", "name": "ESNTab", "values": { "order": 8 } }, { "operation": "merge", "name": "GeneralInfoTab", "values": { "order": 0 } }, { "operation": "merge", "name": "OpportunityTitle", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 2 } } }, { "operation": "merge", "name": "Amount", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 3 } } }, { "operation": "merge", "name": "ResponsibleDepartment", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 3 } } }, { "operation": "move", "name": "ResponsibleDepartment", "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 3 }, { "operation": "merge", "name": "Probability", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 4 } } }, { "operation": "merge", "name": "Owner", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 4 } } }, { "operation": "merge", "name": "Category", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 5 } } }, { "operation": "merge", "name": "Source", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 5 } } }, { "operation": "merge", "name": "Type", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 6 } } }, { "operation": "move", "name": "Type", "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 8 }, { "operation": "merge", "name": "CreatedOn", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 6 } } }, { "operation": "merge", "name": "Partner", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 7 } } }, { "operation": "merge", "name": "CloseReason", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 7 } } }, { "operation": "insert", "name": "DATETIME26d46360-17b4-45ee-acac-da084cf0aa67", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 8, "layoutName": "OpportunityPageGeneralBlock" }, "bindTo": "UsrTestDateTime", "enabled": true }, "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 12 }, { "operation": "merge", "name": "Description", "values": { "layout": { "colSpan": 23, "rowSpan": 1, "column": 1, "row": 0 } } }, { "operation": "insert", "name": "UsrSchemaf6483d73Detaile560e0a4", "values": { "itemType": 2, "markerValue": "added-detail" }, "parentName": "GeneralInfoTab", "propertyName": "items", "index": 5 }, { "operation": "merge", "name": "LeadTab", "values": { "order": 4 } }, { "operation": "merge", "name": "TacticAndCompetitorTab", "values": { "order": 1 } }, { "operation": "merge", "name": "CheckDate", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 2 } } }, { "operation": "merge", "name": "ProductsTab", "values": { "order": 2 } }, { "operation": "merge", "name": "HistoryTab", "values": { "order": 5 } }, { "operation": "merge", "name": "HistoryAccountTab", "values": { "order": 6 } }, { "operation": "merge", "name": "NotesTab", "values": { "order": 7 } }, { "operation": "move", "name": "IsPrimary", "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 0 } ]/**SCHEMA_DIFF*/ }; });
As a result when opening the page you will get a custom button with items:
Also forgot to metion that you need to add localizable strings:
1) For OpportunityPageV2
CustomButtonCaption with "Custom action" value
2) For OpportunitySectionV2
CustomButtonCaption with "Custom button" value
Hope this example help!
Malika,
Hello,
Currently, I'm just getting a button with no dropdown like this
Here's the code for it:
//I've tried two different approaches for the method (both didn't work) based on the above two documentation
methods: {
//approach1
prepareMyActionsButtonMenuItems: function(filter, list) {
if (list === null) {
return;
}
list.clear();
var columns = {};
var value1 = {
displayValue: "a123",
value: "1"
};
var value2 = {
displayValue: "b234",
value: "2"
};
var value3 = {
displayValue: "c345",
value: "3"
};
columns[1] = value1;
columns[2] = value2;
columns[3] = value3;
list.loadAll(columns);
},
//approach 2
prepareMyActionsButtonMenuItems: function(){
this.set("MyActionsButtonMenuItems", ["Sample", "test", "Test5"]);
}
}
attributes: {
"MyActionsButtonMenuItems": {
dataValueType: Terrasoft.DataValueType.COLLECTION,
}
}
diff:[
{
"operation": "insert",
"name": "MyActionsButton",
"parentName": "RightContainer",
"propertyName": "items",
"values": {
"itemType": Terrasoft.ViewItemType.BUTTON,
"caption": "MyActionsButton",
"classes": {
"textClass": ["actions-button-margin-right"],
"wrapperClass": ["actions-button-margin-right"]
},
"prepareMenu": {"bindTo": "prepareMyActionsButtonMenuItems"},
"menu": {"items": {"bindTo": "MyActionsButtonMenuItems"}},
"visible": true
}
}
]
Abilash,
Hi,
The task is to copy the logic of the existing "Actions" button and apply the same to the custom button. To do that (tested in the "Opportunity" section):
1) In the OpportunitySectionV2 section schema:
1.1) Add the CombinedModeCustomActionsButtonMenuItems attribute of the "Collection" dataValueType (Terrasoft.DataValueType.COLLECTION). The example is CombinedModeActionsButtonMenuItems from BaseDataView.
1.2) Create a PTP "GetCardActionsCustom" message with the SUBSCRIBE direction (as done on the BasePageV2)
1.3) In the subscribeSandboxEvents method subscribe to the "GetCardActionsCustom" message and trigger the initCustomActionButtonMenu method when the "GetCardActionsCustom" message is received (as done for the "GetCardActions" message on the BasePageV2)
1.4) Create an extension of the _initCollections method (as done for the basic "Actions" button)
1.5) Add an empty prepareCustomActionsButtonMenuItems function to methods (as done for prepareActionsButtonMenuItems method in BaseDataView)
1.6) Add the initCustomActionButtonMenu method which is a handler for the "GetCardActionsCustom" message (as done with the initActionButtonMenu method from BaseDataView).
1.7) Add the button itself to the diff array
The complete schema of OpportunitySectionV2:
define("OpportunitySectionV2", [], function() { return { entitySchemaName: "Opportunity", attributes: { "CombinedModeCustomActionsButtonMenuItems": { dataValueType: Terrasoft.DataValueType.COLLECTION } }, messages: { "GetCardActionsCustom": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.SUBSCRIBE } }, details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/, diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "name": "CustomActionsButton", "parentName": "CombinedModeActionButtonsCardLeftContainer", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "caption": {"bindTo": "Resources.Strings.CustomActionsButtonCaption"}, "classes": { "textClass": ["actions-button-margin-right"], "wrapperClass": ["actions-button-margin-right"] }, "prepareMenu": {"bindTo": "prepareCustomActionsButtonMenuItems"}, "menu": {"items": {"bindTo": "CombinedModeCustomActionsButtonMenuItems"}} } }, ]/**SCHEMA_DIFF*/, methods: { subscribeSandboxEvents: function() { this.callParent(arguments); const cardModuleSandboxId = this.getCardModuleSandboxId(); this.sandbox.subscribe("GetCardActionsCustom", function(actionMenuItems) { this.initCustomActionButtonMenu("Combined", actionMenuItems); }, this, [cardModuleSandboxId]); }, prepareCustomActionsButtonMenuItems: Ext.emptyFn, _initCollections: function() { this.callParent(arguments); this.set("CombinedModeCustomActionsButtonMenuItems", this.Ext.create("Terrasoft.BaseViewModelCollection")); }, initCustomActionButtonMenu: function(modeType, actionMenuItems) { const collectionName = modeType + "ModeCustomActionsButtonMenuItems"; const collection = this.get(collectionName); if (actionMenuItems.getCount()) { this.set(modeType + "ModeActionsButtonVisible", true); const newCollection = this.Ext.create("Terrasoft.BaseViewModelCollection"); actionMenuItems.each(function(item) { newCollection.addItem(item); }, this); if (collection) { collection.clear(); collection.loadAll(newCollection); } else { this.set(collectionName, newCollection); } } else { this.set(modeType + "ModeActionsButtonVisible", false); } }, } }; });
2) In OpportunityPageV2:
2.1) Create the "GetCardActionsCustom" message (as done for the "GetCardActions" existing message)
2.2) In the init method call the initCustomActionButtonMenu method
2.3) Create the initCustomActionButtonMenu method (as done for the initActionButtonMenu in BasePageV2)
2.4) Create the getCustomActions method (as done with the getActions method in the basic OpportunityPageV2 with only difference that you don't need to call parent method but create an instance of the Terrasoft.BaseViewModelCollection here)
2.5) Add the button itself to the diff array
The complete code is:
define("OpportunityPageV2", [], function() { return { entitySchemaName: "Opportunity", attributes: {}, messages: { "GetCardActionsCustom": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.PUBLISH } }, modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/, details: /**SCHEMA_DETAILS*/{ "UsrSchemaf6483d73Detaile560e0a4": { "schemaName": "UsrSchemaf6483d73Detail", "entitySchemaName": "UsrOppTestDet", "filter": { "detailColumn": "UsrOpportunity", "masterColumn": "Id" } } }/**SCHEMA_DETAILS*/, businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/, methods: { init: function() { this.callParent(arguments); this.initCustomActionButtonMenu(); }, initCustomActionButtonMenu: function() { this.publishPropertyValueToSection("IsCardInEditMode", this.isEditMode()); var actionMenuItems = this.getCustomActions(); var actionsButtonVisible = !actionMenuItems.isEmpty(); this.set("CustomActionsButtonVisible", actionsButtonVisible); this.set("CustomActionsButtonMenuItems", actionMenuItems); this.sandbox.publish("GetCardActionsCustom", actionMenuItems, [this.sandbox.id]); }, getCustomActions: function() { var actionMenuItems = this.Ext.create("Terrasoft.BaseViewModelCollection"); actionMenuItems.addItem(this.getButtonMenuItem({ "Caption": {"bindTo": "Resources.Strings.CustomButtonCaption"}, "Tag": "clickCustomButton" })); return actionMenuItems; } }, dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/, diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "parentName": "LeftContainer", "propertyName": "items", "name": "actions", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "caption": {"bindTo": "Resources.Strings.CustomButtonCaption"}, "classes": { "textClass": ["actions-button-margin-right"], "wrapperClass": ["actions-button-margin-right"] }, "menu": { "items": {"bindTo": "CustomActionsButtonMenuItems"} }, "visible": {"bindTo": "CustomActionsButtonVisible"} } }, { "operation": "merge", "name": "MetricsContainer", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 0 } } }, { "operation": "merge", "name": "OpportunityClient", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 1 } } }, { "operation": "remove", "name": "OpportunityClient", "properties": [ "tip" ] }, { "operation": "merge", "name": "LablelMetricsContainer", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 2 } } }, { "operation": "merge", "name": "BantProfileHeaderContainer", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 0 } } }, { "operation": "merge", "name": "BantIcon", "values": { "layout": { "colSpan": 5, "rowSpan": 1, "column": 0, "row": 0 } } }, { "operation": "merge", "name": "BantHeaderCaption", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 5, "row": 0 } } }, { "operation": "merge", "name": "OpportunityBudget", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 1 } } }, { "operation": "merge", "name": "OpportunityDecisionMaker", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 2 } } }, { "operation": "merge", "name": "OpportunityLeadType", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 3 } } }, { "operation": "move", "name": "OpportunityLeadType", "parentName": "BantProfile", "propertyName": "items", "index": 3 }, { "operation": "merge", "name": "OpportunityDueDate", "values": { "layout": { "colSpan": 19, "rowSpan": 1, "column": 5, "row": 4 } } }, { "operation": "merge", "name": "ESNTab", "values": { "order": 8 } }, { "operation": "merge", "name": "GeneralInfoTab", "values": { "order": 0 } }, { "operation": "merge", "name": "OpportunityTitle", "values": { "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 2 } } }, { "operation": "merge", "name": "Amount", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 3 } } }, { "operation": "merge", "name": "ResponsibleDepartment", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 3 } } }, { "operation": "move", "name": "ResponsibleDepartment", "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 3 }, { "operation": "merge", "name": "Probability", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 4 } } }, { "operation": "merge", "name": "Owner", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 4 } } }, { "operation": "merge", "name": "Category", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 5 } } }, { "operation": "merge", "name": "Source", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 5 } } }, { "operation": "merge", "name": "Type", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 6 } } }, { "operation": "move", "name": "Type", "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 8 }, { "operation": "merge", "name": "CreatedOn", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 6 } } }, { "operation": "merge", "name": "Partner", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 7 } } }, { "operation": "merge", "name": "CloseReason", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 7 } } }, { "operation": "insert", "name": "DATETIME26d46360-17b4-45ee-acac-da084cf0aa67", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 0, "row": 8, "layoutName": "OpportunityPageGeneralBlock" }, "bindTo": "UsrTestDateTime", "enabled": true }, "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 12 }, { "operation": "merge", "name": "Description", "values": { "layout": { "colSpan": 23, "rowSpan": 1, "column": 1, "row": 0 } } }, { "operation": "insert", "name": "UsrSchemaf6483d73Detaile560e0a4", "values": { "itemType": 2, "markerValue": "added-detail" }, "parentName": "GeneralInfoTab", "propertyName": "items", "index": 5 }, { "operation": "merge", "name": "LeadTab", "values": { "order": 4 } }, { "operation": "merge", "name": "TacticAndCompetitorTab", "values": { "order": 1 } }, { "operation": "merge", "name": "CheckDate", "values": { "layout": { "colSpan": 12, "rowSpan": 1, "column": 12, "row": 2 } } }, { "operation": "merge", "name": "ProductsTab", "values": { "order": 2 } }, { "operation": "merge", "name": "HistoryTab", "values": { "order": 5 } }, { "operation": "merge", "name": "HistoryAccountTab", "values": { "order": 6 } }, { "operation": "merge", "name": "NotesTab", "values": { "order": 7 } }, { "operation": "move", "name": "IsPrimary", "parentName": "OpportunityPageGeneralBlock", "propertyName": "items", "index": 0 } ]/**SCHEMA_DIFF*/ }; });
As a result when opening the page you will get a custom button with items:
Also forgot to metion that you need to add localizable strings:
1) For OpportunityPageV2
CustomButtonCaption with "Custom action" value
2) For OpportunitySectionV2
CustomButtonCaption with "Custom button" value
Hope this example help!