Maximo

 View Only

 Maximo Mobile Application link

Surender Balasundaram's profile image
Surender Balasundaram IBM Champion posted Sun March 08, 2026 03:04 PM

Hi Team, 

I would like to know whether in MAS 9.1, we will be able to create a hyperlink under the related tickets section in Technician Mobile application. 

Based on the record class type and unique numbers, is it possible to open Incident Reporter or Service Request application from Technician application. 

Thanks and regards,

Suren

Liliana Malaescu's profile image
Liliana Malaescu IBM Champion

Hi @Surender Balasundaram,

You can add hyperlinks in the mobile applications, using customisation. You can find some examples here: https://ibm-maximo-dev.github.io/configuration-practices-documentation/advanced/external-links.

Hope this helps.

Surender Balasundaram's profile image
Surender Balasundaram IBM Champion

Hi @Liliana Malaescu,

Thanks for your reply with a reference to open an external link from maximo mobile application. 

I'm looking to open an internal application. For example, open SR record from techmobile related records section into Service Requests application by click of a link on the SR record.  

/*
* Redirects to srmobile app
* @param {event} event
*/
async openTicket(event) {
  try {
    let context = {
  page: 'srDetails',
  ticketid:'1042',
  href: 'oslc/os/mxapisr/_U1IvMTAOMg -- '
  };
  this.app.callController('loadApp', {
  appName: 'srmobile',
  context,
});
} catch {
} finally {
     this.page.state.loadAssetData = false;
}
}
Thanks,
Suren
Bartosz Marchewka's profile image
Bartosz Marchewka IBM Champion

Hi @Surender Balasundaram

This is an interesting requirement. I've put together a proof of concept for you today - a working solution that I briefly tested in my local DEV RBA environment. To implement it, you'll need to customize two applications: TECHMOBILE and SRMOBILE. Please apply the solution and do some tests in your environment.

a) Changes in TECHMOBILE application:

1.File src/app.xml - page relatedWorkOrder section states

<page id="relatedWorkOrder" title="Follow-up work" controller="RelatedWoController">
      <states id="d9gdk">
        <state name="forceSyncFollowUP" value="false" type="boolean" id="e2n5d"/>
        <!-- IBM Community Customisation [START] -->
        <state name="cLoadSRData" value="false" type="boolean" id="cLoadSRDataState"/>
        <state name="cLoadingSRTicketId" value="" type="string" id="cLoadingSRTicketIdState"/>
        <!-- IBM Community Customisation [END] -->
      </states>
(...)

 2. File src/app.xml - page relatedWorkOrder section data-list - new button definition and layout 

<middle id="g_w9q">
            <data-list datasource="relatedrectkt" show-search="false" empty-row-style="false" empty-set-string="No related records." id="d9b8x">
              <list-item id="r5dwv">
                <adaptive-row id="xzpvq">

                  (...)

                  <adaptive-column small-width="100" medium-width="10" large-width="10" small-horizontal-align="start" medium-horizontal-align="end" large-horizontal-align="end" id="ereyy">
                    <box direction="column" vertical-align="center" children-hide-overflow="true" id="z9w2_">
                      <label label="{item.relatetypedesc}" padding="default" id="bx9g_"/>
                    </box>
                  </adaptive-column>
                  <!-- IBM Community Customisation [START] -->
                  <adaptive-column small-width="100" medium-width="10" large-width="10" small-horizontal-align="start" medium-horizontal-align="end" large-horizontal-align="end" id="cSRNavAdaptiveColumn">
                    <box direction="column" vertical-align="center" id="cSRNavBtn">
                      <button icon="carbon:chevron--right" kind="ghost" padding="false" loading="{page.state.cLoadSRData &amp;&amp; page.state.cLoadingSRTicketId === item.relatedreckey}" on-click="navigateToSRDetails" on-click-arg="{{'item': item}}" id="cSRNavButton"/>
                    </box>
                  </adaptive-column>
                  <!-- IBM Community Customisation [END] -->
                </adaptive-row>
              </list-item>
            </data-list>
          </middle>

3. File src/AppCustomizations.js new navigateToSRDetails method definition 

// Custom Application Logic

 class AppCustomizations {
   applicationInitialized(app,page) {
     this.app = app;
     this.page = page;
   }

  async navigateToSRDetails(event) {
    const item = event.item;
    const page = this.app.currentPage;

    page.state.cLoadSRData = true;
    page.state.cLoadingSRTicketId = item.relatedreckey;

    try {
      const context = {
        page: 'srDetails',
        ticketid: item.relatedreckey,
      };
      this.app.callController('loadApp', {
        appName: 'srmobile',
        context,
      });
    } catch (e) {
      // navigation failed silently
    } finally {
      page.state.cLoadSRData = false;
      page.state.cLoadingSRTicketId = '';
    }
  }
 }

 export default AppCustomizations;
 

b) Changes in SRMOBILE application:

1.File src/AppCustomizations.js

class AppCustomizations {
   applicationInitialized(app) {
     this.app = app;
     this.setupIncomingContext();
   }

   setupIncomingContext(){
    const incomingContext = this.app?.state?.incomingContext;
    if (incomingContext && incomingContext.ticketid) {
           this.loadSRAndNavigate(incomingContext.ticketid);
    }
   }

  async loadSRAndNavigate(ticketid) {
    try {
      // viewSrDS is offline-immediate-download="false" so it always hits the server
      const viewSrDS = this.app.findDatasource('viewSrDS');
      viewSrDS.clearState();
      viewSrDS.resetState();
      viewSrDS.lastQuery = {};
      viewSrDS.state.currentSearch = '';

      await viewSrDS.initializeQbe();
      viewSrDS.setQBE('ticketid', '=', ticketid);
      await viewSrDS.searchQBE(undefined, true);

      if (viewSrDS.items?.length) {
        this.app.state.selectedSR = viewSrDS.items[0];
        this.app.setCurrentPage({ name: 'srDetails', resetScroll: true });
      }
    } catch (e) {
      // If SR not found or access denied, fall back to main page
    }
  }
   

 }

 export default AppCustomizations;
 

Good luck!

Surender Balasundaram's profile image
Surender Balasundaram IBM Champion

Hi @Bartosz Marchewka , Thanks for your time on creating a working prototype for my question. It worked fine.

Many snippets used in your code are reusable and can be modified for other requirements. 

Thanks again,

Suren

Bartosz Marchewka's profile image
Bartosz Marchewka IBM Champion

Appreciate the feedback @Surender Balasundaram, I'm glad I could help.