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
) is


    l_session_state clob:='Session State:'||chr(13);
    l_team apex_t_varchar2;
    l_app_session number:=v('APP_SESSION');
    l_id number;
    l_card_title varchar2(400):=p_card_title;
    l_scope logger_logs.scope%type := 'create_trello_card';
    l_params logger.tab_param;
    l_errmsg varchar2(400);



BEGIN

    l_team:=apex_string.split(p_team,':');


    if p_include_session = 'Y' then

         for s in (select l_app_session, item_name, item_value
         from (
          -- Application items
          select 1 app_page_seq, 0 page_id, item_name, v(item_name) item_value
          from apex_application_items
          where application_id = p_app_id

          union all
          -- Application page items
          select 2 app_page_seq, page_id, item_name, v(item_name) item_value
          from apex_application_page_items
          where application_id =p_app_id and page_id=p_app_page_id

          )

        order by app_page_seq, page_id, item_name) loop

            l_session_state:=l_session_state||chr(13)||s.item_name||':'||s.item_value;

        end loop;



    end if;



    for i in 1..l_team.count
    loop
        l_card_title:=l_card_title||' '||l_team(i);
    end loop;


    l_id := apex_mail.send(
            p_to        => p_board,
            p_from      => 'sending_address@company.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) 
    loop

    apex_mail.add_attachment(
            p_mail_id    => l_id,
            p_attachment => c1.blob_content,
            p_filename   => c1.filename,
            p_mime_type  => c1.mime_type);

    end loop;

    apex_mail.push_queue;
    
exception

    when others then
    
     l_errmsg:= SQLERRM;
     logger.append_param(l_params, 'p_session',v('APP_SESSION'));
     logger.log(l_errmsg, l_scope, null, l_params);
     -- handle exception.....
end;

Clicking on the button calls this page process:

begin

CREATE_TRELLO_CARD(
:APP_ID,
:APP_PAGE_ID,
:P1_BOARD,
:P1_SESSION_STATE,
:P1_TEAM,
:P1_LABEL,
:P1_CARD_TITLE,
:P1_DESCRIPTION,
:P1_ATTACHMENT
);
end;

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!

APEXionately yours,

Michelle