Recently one of the users has asked a question "Would it be possible to display selected master row data in detail interactive grid region header?". Yes, why not, it's indeed a reasonable request. However, during implementation, I have found it is little tricky to implement a solution which works in all cases and finally I have managed to get it done. I am sharing this here as it may help other APEX developers.
For demo purpose, consider Interactive Grid (IG) on Department table as master and IG on Employees table as detail. And assume requirement is to display selected/current department name in Employees IG region title.
To implement this, let's create Dynamic Action (D.A.) as below
- Create D.A. and give it a proper name e.g. "Sel Change - Set EMP Title"
- In "When" Section, select
- Event: Selection Change [Interactive Grid]
- Selection Type: Region
- Region: Departments (In the demo, Master IG region name is "Departments")
- True Action
- Action: Execute JavaScript Code
- Code: Refer below code
try { // Static id specfied for Departments IG: dept var gridView = apex.region("dept").widget().interactiveGrid("getCurrentView"); var records = gridView.getSelectedRecords(); // other option to get selected rows is as below from event data // var records = this.data.selectedRecords; // but, not using as this approach as this event was not passing any data before APEX 18.2, // other reason is, in 19.2 (and probably in 19.1 and 18.2), above code is not returning any data when IG is in edit mode var model = gridView.model; var currDept = model.getValue(records[0], "DNAME"); if (records.length === 1 && currDept !== "") { // Using standard region template for Employees IG // Static id specfied for Employees IG: emp // Department Name field is simple text field. For LOV based items, you may want to use currDept.d syntax to get display value $("#emp_heading").html(currDept + " Employees"); } else $("#emp_heading").html("Employees"); } catch (error) { // when "Select First Row" is disabled, then after page load, this code gives JavaScript error // we can get error when user un checks all the rows // these cases, just set generic title $("#emp_heading").html("Employees"); }
This works in most of the cases. But, consider user is changing department name and moving to location field or adding new department, then, in these cases, users will not see latest department name in detail IG title immediately. So, we need another D.A. to listen to department name changes and update the Employees IG region title.
So, let's create another D.A. as below
- Create D.A. and give it a proper name e.g. "DNAME Change - Set EMP Title"
- In "When" Section, select
- Event: Change
- Selection Type: Column(s)
- Region: Departments (In the demo, Master IG region name is "Departments")
- Column(s): DNAME (As we are using DNAME in Details IG title, we should listen changes on this column)
- True Action
- Action: Execute JavaScript Code
- Code: Refer below code
var gridView = apex.region("emp").widget().interactiveGrid("getCurrentView"); var records = gridView.getSelectedRecords(); var currDept = $v(this.triggeringElement); // set details IG title only when deparment name is not empty and only one row is selected if (currDept !== "" && records.length === 1) $("#emp_heading").html(currDept + " Employees"); else $("#emp_heading").html("Employees");
Comments