Skip to main content

Posts

APEX Alpe Adria 2024

T Third time the charm. I love this conference, love the atmosphere, love the people. This year I have really enjoyed the networking and made few new friends. Sadly, Peter's minions were not present again, and this time nor was Peter. The APEX team was a bit more secretive than usual, but it here are some statements: APEX 24.1 will be a bit late (no news) It might and it might not bring us the 5 features promised on last Kscope (you could actually made and deliver a baby during this waiting) Oracle has build 41 thousands of bespoke internal APEX applications Cloud starting prices for APEX service were dramatically reduced And I have done it. I finally stepped up and presented something on a conference for the first time, in front of a real audience with 70+ people. And that something was a bit controversial topic. Huge thanks to the people supporting me, also huge thanks to all guys who made this conference happen. I have enjoyed it more than ever befor
Recent posts

Insert JavaScript and CSS code to APEX from PL/SQL

O One of my colleagues (lets name him Max) prepared a surprise for me. I had no idea where is the JavaScript code being placed on page. Turned out, there is an API for injecting JavaScript code from PL/SQL and you can do the same with CSS. That is not just an excellent hiding place, but it can be used if you need to attach these on page dynamically. Checkout the APEX_JAVASCRIPT api, especially the ADD_ONLOAD_CODE procedure. For example you can set the JavaScript variable from the PL/SQL. BEGIN APEX_JAVASCRIPT.ADD_ONLOAD_CODE ( p_code => 'variable_name = new_value;' ); END; / Better version would be to escape the value using ADD_VALUE (which is an equivalent of APEX_EXEC.ENQUOTE_LITERAL but for JavaScript) or APEX_JAVASCRIPT.ESCAPE function: BEGIN APEX_JAVASCRIPT.ADD_ONLOAD_CODE ( p_code => 'variable_name = ' || APEX_JAVASCRIPT.ADD_VALUE('new_value', p_add_comma => FALSE) || ';' ); END; /

Global page in APEX (page zero)

T There are plenty of things you can do on global page. Not everything is a great idea. Typical usage would be: Regions used on multiple pages Page items used through multiple pages JavaScript and CSS styles Dynamic actions Footer with some extra info Regions Typically it is some sort of navigations or filtering and that is perfectly fine. You should be aware that you can also create same region with source as "Function Body returning SQL Query" or by using "Dynamic Content" region (and ofc. having content in package, not on page). For complex components you could also create your own plugin. This is useful to know specially if you want the same content on different places on page. JavaScript and CSS styles It might be ok to have scripts and styles on global page, but unless you need them just on specific pages (or you want to apply server side conditions to them), I would rather store them in application files. Or even better in worksp

Remove active tabs on demand

I I wanted to keep selected tabs saved for the user, but reset them on some event. Typical use case is that user open page for specific record, the page has multiple tabs and he switch to not default tab. Here starts the issue. When he switch to a different record, it is better to start on default tab, but if he submits the page, it is better to preserve selected tabs. I have figured out that it is stored in session storage and I have come up with this solution. When the page is loaded with clear flag, then I also remove all tabs on page, otherwise I don't touch it. const reset_tabs = function() { if (window.location.search.includes('&clear=')) { $('div.t-TabsRegion.js-useLocalStorage').each(function() { var region_id = $(this).attr('id'); var key = 'ORA_WWV_apex.apexTabs.' + apex.env.APP_ID + '.' + apex.env.APP_PAGE_ID + '.' + region_id + '.activeTab'; var v

APEX & multicolumn navigation (custom mega menu)

W When the mega menu came out, I was very pleased. Then I tried to use it and quickly abandon it. Now I wanted to cleanup my menus so I build my own. What I wanted was to have the several multicolumn menus, not just one. With icons, badges, different levels. I also wanted to manage where exactly it will split to the new column... And without any JavaScript. So I can create something like this: Check the article about custom navigation for some basics. How I achieved this? changed template for navigation created view to feed the template add a column value to the navigation table The template is basically just concatenating the arguments from the list, something like: #A08#<li #A10#>#A01##A02##A03##A04##A05##A06##A07#</li>#A09# The view (source for the list is returning these #A0?# fields: SELECT n.lvl, n.attribute01, -- content <li>...</li> n.attribute02, n.attribute03, n.attribute04, n.attribute0

Combine open door and SSO login #JoelKallmanDay

S Sometimes I need to login as a specific user to verify what he/she can access and see. And most of the times I would like to login as me with a single button. So I created login page like this: So I can signup with any user I like or use the Google button to sign up via Google SSO. In corporates we would typically use Microsoft 365 SSO. To make this more secure, the login field, button and process behind are visible only to developers (users signed up in APEX Builder) thanks to my core.is_developer function used as authorization scheme on these components. You should also disable the login field, button and process on production. Best approach would be to assign a Build option and disable it. Or/and you can use the SSO authentication as default there. If I am not signed in APEX Builder, I will not have the option to sign as anyone: And here is the trick how to do this: Create Google SSO authentication Enable Switch auth scheme on your open door and SSO au

Setup SSO for APEX Builder + recovery on failure

I I was very tired of filling out the forms for signing into the APEX Builder, so I decided to use the SSO there too. I wont cover how to get the credentials , but here is a great step by step article how to do that. So assuming you did setup your SSO credentials, log into INTERNAL workspace as ADMIN user. This could be the last time you have to sign in with a password, isn't that cool? At the top click on Manage Instance and Security and consider following changes: on Security tab change Allow Persistent Auth to Yes on Authentication Control tab under Development Environment Settings change Require User Account Expiration and Locking to No under Development Environment Authentication Schemes edit the SSO option To configure Google SSO, fill the fields carefully like this (use your own credentials obviously): Scope = profile,email Username = #email# Additional User Attributes = email,name For different providers parameters would var

Product design and product discovery with APEX

A All APEX developers know that you can develop prototypes really fast. Many times even the whole applications. But sometimes, the expectations from your stakeholders can be very different then what it is possible to do in APEX in reasonable time. Sometimes, the requirements you receive might be weird from your point of view. As a developer, you should think about extending your knowledge to the product world. To think about apps you build from the product/customer perspective. Don't thing too much on the features and technical side, think more about benefits for users and solving users problems. There are some excellent resources on the market and you can get most of them for free. In just few hours of your time you might change your perspective how to develop software. There is a great course and bottomless well of wisdom about building products from Pawel Huryn . Just subscribe to the free (or paid) newsletter, explore the blog or/and go for Continuous Product Discovery M

Trips Planning app

I I had to plan a trip to Iceland. Previously I was drawing timelines on paper to make sure I can get there in time, to utilize my time on the location and to avoid any overlaps. But with this trip I knew it will be too much redo, so I thought about doing it in APEX... The Plan I need a grid to input the data and I need a Gantt chart to render it as timeline. Thats it. I had a fully functional prototype in 2 hours (I was stuck for a while on the chart). Since that I added some small features, like: daily overview so I can check (and eventually print) just specific days customizable colors, per event/stop category with event/stop level override added costs and flags so I can keep track of things I need to pay or do clickable chart (thanks to Hari), so I can click on event on chart to adjust it dynamic chart height (thanks to Hari) based on the number of categories used on trip I am planning to add maps thanks to suggestion from Jayson . Finally, this is t

Oracle ACE Associate, 2023-2024

I It is the time of the year when ACEs for next season are announced. It was hard to get into this program, it is a bit easier to stay in it. I had to collect 100 points and I did managed 360, most of them through my blog. Hopefully next year I will reach to ACE Pro and get the few things I miss. So far I am contributing through my blog for over 2 years (and I have just reached the 100k views), and on GitHub a bit longer through my several open source projects. Being an ACE motivates me to write a better content, to not get satisfied with quick articles and don't go for easy topics. Basically I have to produce something I can be proud of. And that is great. ACE benefits You can explore the official list of benefits under Why join section. What I got from the ACE program? I can't say it was life changing, at least not yet, but: I can brag about being ACE I am part of the great community, I can reach out to these people more easily and I did connected