While it’s definitely not perfect, I have used the Feedback option in Team Development on a number of projects. It’s been a pretty handy way of quickly capturing basic feedback from users, all the while logging information about users and session state. But the workflow and follow up of issues has always been a challenge, and in fact, the APEX team has announced that it is now deprecated and will be removed in future releases.
If you know anything about me by now, I just love a drool-worthy card-based UI. Add in some powerful drag and drop features, and I am all over it! So it should come as no surprise that my team uses Trello to track tasks and work. I therefore thought I would try to replace some of the features I loved about Feedback with a quick and easy ‘Create Trello Card’ button.
Our Trello Setup
We use different Trello boards to segregate the work between our teams. We also label our cards within boards to make them easy to filter by module or application. Finally, we tag specific members on cards when we know who needs to work on them.
Lists of Values
We created a few LOVs to track our different boards, labels, and team members. Trello provides some good documentation about how to automatically tag members and assign labels to cards via email, so I needed to have these available in my APEX application. Each board also has a nifty ’email-to-board’ address that allows you to auto-magically create a card via email.
Add Link to Nav Bar
I then created a simple modal page that is called from a permanent link in the Nav Bar, just like Feedback always was:
Clicking on the link opens up my Modal page that looks like this:
- The board selection basically returns the email address for it.
- Selecting a tag adds a hashtag to the subject line that will automatically assign it to the right label on my Trello board.
- The Team shuttle adds team member Trello usernames to the card description, which is the equivalent of tagging them as members of the card.
I also wanted to provide users the ability to upload an attachment or screenshot, and of COURSE, I wanted to include Session State information should the user deem it relevant. By default, we set it to yes. Shout-out to LOGGER here, because, full disclaimer, I did sneak a peak at logger.log_apex_items to do something similar. No shame in not wanting to reinvent the wheel, amiright??
create or replace procedure CREATE_TRELLO_CARD(
p_app_id in number,
p_app_page_id in number,
p_team in varchar2,
p_include_session in varchar2,
p_board in varchar2,
p_label in varchar2,
p_card_title in varchar2,
p_description in varchar2,
p_attachment in varchar2
l_session_state clob:='Session State:'||chr(13);
l_scope logger_logs.scope%type := 'create_trello_card';
if p_include_session = 'Y' then
for s in (select l_app_session, item_name, item_value
-- Application items
select 1 app_page_seq, 0 page_id, item_name, v(item_name) item_value
where application_id = p_app_id
-- Application page items
select 2 app_page_seq, page_id, item_name, v(item_name) item_value
where application_id =p_app_id and page_id=p_app_page_id
order by app_page_seq, page_id, item_name) loop
for i in 1..l_team.count
l_id := apex_mail.send(
p_to => p_board,
p_from => 'email@example.com',
p_subj => l_card_title||' '||nvl(p_label,''),
p_body => p_description||chr(13)||l_session_state,
p_body_html => p_description||chr(13)||l_session_state);
for c1 IN (select filename, blob_content, mime_type FROM apex_application_temp_files where name=p_attachment)
p_mail_id => l_id,
p_attachment => c1.blob_content,
p_filename => c1.filename,
p_mime_type => c1.mime_type);
when others then
logger.log(l_errmsg, l_scope, null, l_params);
-- handle exception.....
Clicking on the button calls this page process:
The Trello Card
Here is a sample card created from the Survey Builder Packaged App. Notice the session state? I love this. You could probably improve on this and only pass through non-null values.
Ultimately, we wanted a single-click way of allowing users or team members to provide feedback on our apps, mainly during the development/QA phase. Dimitri discusses other ways of handling this in his post here.
This is an extremely simple way of mimicking some of the features we loved about Feedback and Team Development, and pushing issues/items out to a tool we’re using anyway.
Hope this helps!