This Cheat Sheet is a collection of blog/forum posts related to APEX Grid from version 5.1.*
From APEX 18.2 there's Interactive Grid documentation available on https://docs.oracle.com/database/apex-18.2/AEXJS/interactiveGrid.html
Interactive Grid: Under the Hood
Interactive Grid column widths
How to hack APEX Interactive Grid Part 1
How to hack APEX Interactive Grid Part 2
How to hack APEX Interactive Grid Part 3
APEX Interactive Grid API Improvements in 5.1.1
How to hack APEX Interactive Grid Part 4
APEX Interactive Grid Cookbook
Some minor new things in APEX 18.2
Interactive Grid: Download as PDF with jsPDF by MENNO HOOGENDIJK
Pimp my Grid App - IG Sample App
Hidden and display columns
How to set value of a hidden column
How to set value of a display column
Disable Column Actions How to validate disable cell in interactive grid?
The noHeaderActivate option still allows resize, reordering and sorting columns. In 5.1.1 you can disable those features with the Advanced JavaScript Code the config options are config.views.grid.features: resizeColumns, reorderColumns, sort
https://community.oracle.com/thread/4049804
https://community.oracle.com/thread/4050640 https://community.oracle.com/thread/3812273
https://community.oracle.com/thread/4047292
https://community.oracle.com/thread/4051443
https://community.oracle.com/thread/4036606
https://community.oracle.com/thread/4060416
https://community.oracle.com/thread/4030402
https://community.oracle.com/message/14473170#14473170
https://community.oracle.com/thread/4068205
Before APEX 18.1 you should use:
apex.region("emp").widget().interactiveGrid
instead of
apex.region("emp").call
var grid = apex.region('emp').call('getViews','grid');
var model = grid.model;
var record = model.getRecord(vRecordId);
apex.region("emp").call("option","config")
apex.region("emp").call("getViews").grid.model.getOption("fields");
For possible options look at model.js defaultOptions object
From the model:
apex.region("emp").call("getViews","grid").view$.grid("getSelectedRecords")
Selected DOM elements
apex.region("emp").call("getViews","grid").view$.grid("getSelection")
To check if IG is in edit mode use this:
apex.region("emp").call("getActions").get("edit")
var grid = apex.region('emp').call('getViews','grid');
var model = grid.model;
var record = model.getRecord(vRecordId);
model.setValue(record,'ENAME', vEname);
apex.region("emp").call("getActions").invoke("selection-refresh")
For non-editable IG look at http://roelhartman.blogspot.hr/2017/07/refresh-selected-rows-in-interactive.html
- Add static ID (for example tabs) to the tabs region.
- Add to page attribute execute when page loads:
$("#tabs").on("atabsactivate", function(event, ui) {
if (ui.showing) {
ui.active.panel$.find(".a-GV").grid("refresh");
}
});
$('.apex-rds').data('onRegionChange', function(mode, activeTab) {
if (activeTab.href != "#SHOW_ALL"){
apex.region(activeTab.href.replace("#","")).refresh();
}
});
function(config) {
if (!config.toolbar) {
config.toolbar = {};
}
config.toolbar.searchField = false;
return config;
}
function(config) {
if (!config.toolbar) {
config.toolbar = {};
}
config.toolbar.actionMenu = false;
return config;
}
In 5.1.2.00.09 there's a bug Bug 26403439. Workaround available here.
function (config){
config.views.grid.features.reorderColumns = false;
return config;
}
or (from 5.1.1):
function(config) {
config.defaultGridViewOptions = {
reorderColumns: false
}
return config;
}
By using this property you can still reorder columns by using keyboard or Columns dialog (tested in 5.1.2.00.09) - known Bug 26415403. Demo is available here.
function(config) {
config.defaultGridViewOptions = {
resizeColumns: false
}
return config;
}
To list actions call:
apex.region("emp").call("getActions").list().forEach(function(a) { console.log("Action Label: " + a.label + ", Name: " + a.name + (a.choice !== undefined ? ", Choice: " + a.choice : "") ); });
To call action use: apex.region("emp").call("getActions").invoke("show-sort-dialog");
apex.region("emp")
.call("getViews").grid
.rowActionMenu$.menu("option")
.items.push({type:"action", label:"Hi", action: function(){alert("Hi")}});
More on John's blog
To add custom row action to specific position in row action menu use this JS code (only change second if statement) and add it to the Function and Global Variable Declaration page property:
$(function() {
$("#emp").on("interactivegridviewchange", function(event, data) {
if ( data.view === "grid" && data.created ) {
var view$ = apex.region("emp").call("getViews", "grid");
if (view$.rowActionMenu$){
var menu$ = view$.rowActionMenu$.menu("option").items;
for (i = 0; i < menu$.length; i++ ) {
if (menu$[i].action === 'row-duplicate'){
menu$.splice(i+1
, 0
, {
type:"action",
label:"After Copy Action",
icon: "fa fa-user",
action: function(menu, element) {
var record = view$.getContextRecord( element )[0];
alert('After copy action: '+view$.model.getValue(record, "EMPNO"));
}
})
break;
}
}
}
}
});
});
Demo is available here
function(config) {
config.initActions = function( actions ) {
actions.remove("row-duplicate");
};
return config;
}
To list all action names see Actions paragraph above. More on OTN
function(config) {
config.defaultGridViewOptions = {
persistSelection: true
};
return config;
}
How to turn off auto add row feature:
function(config) {
config.editable.autoAddRow = false;
return config;
}
function(config) {
config.defaultGridViewOptions = {
footer: false
};
return config;
}
There are also options for other grid views (defaultIconViewOptions, defaultIconViewOptions, defaultDetailViewOptions).
Declarative properties override config properties. To enable config properties, delete Row Selector column. Possible properties are multiple and selectAll:
function(config) {
config.defaultGridViewOptions = {
multiple: true,
selectAll: true
}
return config;
}
You can set rowHeader to sequence to display rownumbers instead of selector:
function(config) {
config.defaultGridViewOptions = {
rowHeader: 'sequence'
}
return config;
}
var view = apex.region("emp").call("getCurrentView");
if ( view.internalIdentifier === "grid" ) { // only grid supports editing
view.model.clearChanges();
}
apex.region("emp").refresh();
apex.region("regionStaticID").focus();
It's important to set Static ID property of the button (in this example it's btnSubmit)
var vModel = this.data.model;
var vRecord = this.data.selectedRecords[0];
if(vRecord){
vColValue = vModel.getValue(vRecord, 'JOB');
if(vColValue=='MANAGER'){
apex.item('btnSubmit').disable();
}else{
apex.item('btnSubmit').enable();
}
}
Demo is available here.
- Create Selection Change DA on detail region (in this example with static ID emp) and add true action Execute JavaScript Code:
if (this.data.model.getTotalRecords()==0){
$('#emp button[data-action=selection-add-row]').hide()
}else{
$('#emp button[data-action=selection-add-row]').show()
}
Check if attribute "Add Row If Empty" is switched off.
-
interactivegridviewmodelcreate
explanation and example here
-
interactivegridviewchange
-
interactivegridcreate
-
interactivegridreportsettingschange
-
interactivegridselectionchange
-
interactivegridsave
Fires after the save event of the IG has finished. Similar to the "afterrefresh" event of an Interactive Report. You can use this as a Custom Event in a Dynamic Action.
From version 5.1.1 it's possible to disable column header menu:
function(config) {
config.defaultGridColumnOptions = {
noHeaderActivate: true
};
return config;
}
The noHeaderActivate option still allows resize, reordering and sorting of columns.
Also, it's possible to disable specific feature:
function(config) {
// create 'features' object if it does not exist
config.features = config.features || {};
config.features.sort = false;
config.features.aggregate = false;
return config;
}
Bug 26147254 - Duplicated private reports - Details from OTN
Bug 26403861 - Detail IG region is not refreshed if not visible (in tab) - Details from OTN
Bug 26403439 - INTERACTIVE GRID SETTING TOOLBAR.SEARCHFIELD = FALSE DOES NOT HIDE SEARCH INPUT - Details from OTN
Bug 26415403 - INTERACTIVE GRID SETTING VIEWS.GRID.FEATURES.REORDERCOLUMNS=FALSE DOES NOT WORK Details from OTN
#25974131 Error on Save - no data found for .
IG Problems by Peter Raganitsch