Skip to main content

Dynamic Column Labels in Oracle APEX Interactive Grid Using Page Items

Dynamic Column Labels in Oracle APEX Interactive Grid Using Page Items

Oracle APEX / JavaScript  ·  Interactive Grid

When building data-driven applications in Oracle APEX, column headers sometimes need to reflect dynamic labels rather than hardcoded ones. This post walks through generating column names from a page item value.


The Requirement

The goal was straightforward: an Interactive Grid whose column headers are generated dynamically based on a page item, updating both on page load and whenever the user changes the item value manually.

The page item P24_LABEL_ITEM holds a range string in this format:

RESULT1-RESULT5

This means the grid columns should be labeled RESULT1,RESULT2, RESULT3 ... RESULT5 sequentially — without any hardcoding in the region or column settings.


The JavaScript Solution

Place the following code under Execute when Page Loads. The same block can be reused inside a Dynamic Action triggered on the page item's Change event.

setTimeout(function () {

    let itemValue = $v("P24_LABEL_ITEM");
    let labels = [];

    if (itemValue) {

        // Parse prefix and numeric range from "RESULT1-RESULT5"
        let parts  = itemValue.split("-");
        let prefix = parts[0].match(/[A-Za-z]+/)[0];
        let start  = parseInt(parts[0].replace(/\D/g, ""));
        let end    = parseInt(parts[1].replace(/\D/g, ""));

        // Build label array: ["RESULT1", "RESULT2", ..., "RESULT5"]
        for (let i = start; i <= end; i++) {
            labels.push(prefix + i);
        }

        // Access the Interactive Grid region
        let region = apex.region("IG_ST_ID");
        let ig$    = region.widget();
        let view   = ig$.interactiveGrid("getCurrentView");

        // Detect edit mode via the model's editable option
        let isEditMode = view && view.model && view.model.getOption("editable");

        // In edit mode, skip first 2 system columns (checkbox + row actions)
        let skipCount    = isEditMode ? 2 : 0;
        let labelIndex   = 0;
        let currentIndex = 0;

        let $headers = $("#IG_ST_ID").find(".a-GV-header, .a-GV-columnHeader");

        $headers.each(function () {
            let $th = $(this);

            if (currentIndex < skipCount) {
                currentIndex++;
                return;
            }

            let $label = $th.find(".a-GV-headerLabel");

            if ($label.length && labelIndex < labels.length) {
                $label.text(labels[labelIndex]);
                labelIndex++;
            }

            currentIndex++;
        });
    }

}, 800);

The Key Challenge — Edit Mode Column Offset

Oracle APEX Interactive Grid renders extra system columns when the grid is in Edit Mode that simply do not exist in read-only mode.

Column Position Edit Mode Read-Only Mode
Column 1 Row Selector (checkbox) First data column
Column 2 Row Actions (menu) Second data column
Column 3 onward Your data columns

Without accounting for this offset, labels get applied to the system columns first — the first label lands on the checkbox column, the second on the row actions column, and all subsequent labels shift by two positions.

The Fix

Detect edit mode using the grid model's editable option and skip system columns accordingly:

let isEditMode = view && view.model && view.model.getOption("editable");
let skipCount  = isEditMode ? 2 : 0;

During the header loop, a separate counter tracks position and skips the first skipCount elements before applying any labels — keeping the logic clean and working correctly regardless of grid mode.


Triggering on Page Item Change

To refresh labels when the user manually changes the item value, create a Dynamic Action with these settings:

Dynamic Action Setup Event: Change   |   Selection Type: Item   |   Item: P24_LABEL_ITEM
True Action: Execute JavaScript Code — paste the same block above.

This ensures column headers remain in sync with the page item at all times, whether set by the application on load or changed by the user at runtime.


Result

  • Page Load Labels generated from the page item after an 800ms render delay
  • Edit Mode First 2 system columns correctly detected and skipped
  • Item Change Dynamic Action re-runs the script and refreshes all headers

Why the 800ms Delay?

The setTimeout delay is intentional. APEX Interactive Grid takes time to fully render its DOM — including header elements — after the page finishes loading. Attempting to query .a-GV-headerLabel too early returns empty results. A delay of 800ms reliably covers the grid's internal initialization in most environments, though it can be tuned based on page complexity and network conditions.


The solution is clean, reusable, and works seamlessly across both grid modes without any changes to APEX column configuration.

Comments

Popular posts from this blog

APEX - Tip: Fix Floating Label Issue

Oracle APEX's Universal Theme provides a modern and clean user experience through features like floating (above) labels for page items.  These floating labels work seamlessly when users manually enter data, automatically moving the label above the field on focus or input.  However, a common UI issue appears when page item values are set Dynamically the label and the value overlap, resulting in a broken and confusing user interface. once the user focuses the affected item even once, the label immediately corrects itself and displays properly. When an issue is reported, several values are populated based on a single user input, causing the UI to appear misaligned and confusing for the end user. Here, I'll share a few tips to fix this issue. For example, employee details are populated based on the Employee name. In this case, the first True Action is used to set the values, and in the second True Action, paste the following code setTimeout(function () {   $("#P29_EMAIL,#P29_...

Oracle APEX UI Tip: Display Page Title Next to the APEX Logo

In most Oracle APEX applications, every page has a Page Title displayed at the top. While useful, this title occupies vertical space, especially in apps where screen real estate matters (dashboards, reports, dense forms). So the goal is simple: Show the page title near the APEX logo instead of consuming page content space. This keeps the UI clean, professional, and consistent across all pages. Instead of placing the page title inside the page body:         ✅ Fetch the current page title dynamically         ✅ Display it right after the APEX logo         ✅ Do it globally, so it works for every page All of this is achieved using:         ✅ Global Page (Page 0)         ✅ One Dynamic Action         ✅ PL/SQL + JavaScript Simple, effective, and reusable. 1️⃣ Create a Global Page Item On Page 0 (Global Page), create a hidden item:      P0_PAGE_TITLE This item wi...

Building a Custom Debug Package for Oracle APEX Using PL/SQL

While developing Oracle APEX applications, debugging page processes and backend PL/SQL logic can be challenging—especially when values are lost between processes or execution flow is unclear.  Although DBMS_OUTPUT is useful, it doesn’t work well inside APEX runtime. To solve this, I built a custom PL/SQL debug Package that logs execution flow and variable values into a database table.  This approach helps trace exactly where the code reached, what values were passed, and whether a block executed or not - even inside page-level processes and packaged procedures Why a Custom Debug Package? Works seamlessly inside Oracle APEX page processes Persists debug information even after session ends Helps trace execution flow Captures runtime values Can be turned ON/OFF dynamically Does not interrupt business logic The Package consists of:- Debug Table                         -  Stores debug messages Sequence ...