DTaTiA#2 - Dominik's Tips and Tricks in APEX#2: Freeze columns in Interactive Report #JoelKallmanDay

DTaTiA#2 - Dominik's Tips and Tricks in APEX#2: Freeze columns in Interactive Report #JoelKallmanDay

Have you wondered how to freeze columns in Interactive Report in APEX? In Interactive Grid it's no problem, you use the snowflake icon:

When it comes to Classic Report, there is also a solution, a plugin written by a colleague from work (great work Bartosz Sypuła!):

https://github.com/Pretius/pretius-extend-classic-report

What about Interactive Report? I think I found a solution to this case, and here is the effect we would like to achieve:

You need to do 2 things. First, add the following code to your Code Editor - Inline page:

/* freeze 1st column in IR */
.a-IRR-table tr th:nth-child(1),
.a-IRR-table tr td:nth-child(1) {
    position: sticky;
    left: 0px !important;
    background: #73b804;
}

/* adding/gluing the next columns to the first one: 
second, third and fourth */
.a-IRR-table tr th:nth-child(2),
.a-IRR-table tr td:nth-child(2),
.a-IRR-table tr th:nth-child(3),
.a-IRR-table tr td:nth-child(3),
.a-IRR-table tr th:nth-child(4),
.a-IRR-table tr td:nth-child(4) {
    position: sticky;
    background: #9bfb02;
}

Remember that this example is for 4 columns, if you want fewer of them you have to remove 2 lines of code responsible for a given column, e.g. if you want to remove column 4 you have to remove these 2 lines of code:

.a-IRR-table tr th:nth-child(4),
.a-IRR-table tr td:nth-child(4)

Similarly, if you want to add column 5th, you need to add the CSS code:

.a-IRR-table tr th:nth-child(5),
.a-IRR-table tr td:nth-child(5)

On the App Builder page it looks like this:

The next step is to add JavaScript code as a dynamic action on Page Load:

const colWidths = [];
const numCols = 4; // Assuming you want to set styles for 4 columns

// Collecting column widths
for (let i = 1; i <= numCols; i++) {
    colWidths[i] = $(`.a-IRR-table tr th:nth-child(${i})`).width();
}

// Setting styles
for (let i = 2; i <= numCols; i++) {
    let leftOffset = 0;
    for (let j = 1; j < i; j++) {
        leftOffset += colWidths[j];
    }
    $(`.a-IRR-table tr th:nth-child(${i}), 
       .a-IRR-table tr td:nth-child(${i})`).css("left", leftOffset);
}

Of course, line 2 specifies the number of columns to be frozen. On the App Builder page it looks like this:

Important! Remember that if you change the number of columns to freeze in the CSS code, you must also change this number in the JS code.

const numCols = 5; // Assuming you want to set styles for 5 columns

I am also aware that this solution could be changed to a plugin, but it is a "quick" idea that I had to implement in one of the projects.

Until next time! Stay tuned!