cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
oml
Helper III
Helper III

Troubleshoot display value in lookup field

Hi,

 

I have this strange issue where I have three related lookup fields in a hierarchy,

  • flx_buildingtable
  • flx_buildingfloor
  • flx_buildingunit

oml_1-1703014906376.png

I use the OOB filtering when going from parent lookup to child lookup. So going from Property (flx_buildingtable) to Floor, to Unit is all OOB filtering. This works just fine.

 

If I go directly to the Property Unit and select a unit, I have some JS code to populate the related parent Floor and Property. This is also working just fine.

However, I noticed something strange. When I remove the values in the Unit lookup and Floor lookup, my code executes correctly and fetches the right values for the Floor lookup. But, the display value remains blank as shown in the screenshot.

After re-selecting a unit, I inspected the floor lookup field and debugged the JS code. From my analysis, it appears that the correct value has been obtained to populate the floor lookup field. The function responsible for populating the field has also been triggered with the correct values. However, the field still appears to be blank despite all these efforts.

 

After refreshing the page, the fields are cleared and the function works the first time. However, any subsequent attempts to use the function result in blank display values, despite the inspected data being correct.

 

This is currently my JS code:

Here is the order in which the triggered functions are executed when selecting a unit to help you understand the behavior:

  1.  handleBuildingUnitChange()
  2. checkValuesOnPage()
  3. fetchPropertyHierarchy()
  4. populateLookupField()

 

 

$(document).ready(function () {
    debugger;
    // Filter unit lookup view
    var list = $("#flx_buildingunit_lookupmodal").find(".entity-lookup").find(".entity-grid").eq(0);
    list.on("loaded", function () {
        var propertyColumnIndex = 3;
        //var specificValueToShow = $("#flx_buildingtable").val();
        var specificDisplayValueToShow = $("#flx_buildingtable_name").val();

        if (specificDisplayValueToShow !== null && specificDisplayValueToShow !== "") {
            filterUnitLookupView(list, specificDisplayValueToShow, propertyColumnIndex);
        }
    })


    // Change event for flx_buildingunit
    $("#flx_buildingunit").change(function () {
        handleBuildingUnitChange($(this).val());
    });

    // Change event for flx_buildingfloor_name
    $("#flx_buildingfloor").change(function () {
        debugger;

        var selectedValue = $(this).val().trim();

        // Check if the value is not empty before calling handleBuildingFloorChange
        if (selectedValue !== "") {
            console.log("before handleBuildingFloorChange()");
            handleBuildingFloorChange(selectedValue);
        } else {
            console.log("before nullifyBuildingFloorField()");
            // Optionally, you can nullify the field here or perform any other action
            nullifyBuildingFloorField();
        }

        handleBuildingFloorChange($(this).val());
    });
});

function nullifyBuildingFloorField() {
    debugger;
    // Nullify the field on the page
    $("#flx_buildingfloor").val("");  // Set the value to an empty string
    $("#flx_buildingfloor_name").val("");  // Set the display name to an empty string
}

function handleBuildingUnitChange(selectedValue) {
    // Show loading wheel while waiting for the response
    showLoading();

    // Check if the values are already present on the page
    if (!checkValuesOnPage()) {
        console.log("inside checkValuesOnPage if condition!");
        // If not, make the fetch call
        fetchPropertyHierarchy(selectedValue);
    } else {
        // If yes, hide the loading indicator
        hideLoading();
    }
}

function handleBuildingFloorChange(selectedValue) {
    debugger;
    // Show loading wheel while waiting for the response
    showLoading();

    // Check if the values are already present on the page
    if (!checkPropertyValueOnPage()) {
        console.log("inside checkPropertyValueOnPage if condition!");
        // If not, make the fetch call for building table
        fetchBuildingTable(selectedValue);
    } else {
        // If yes, hide the loading indicator
        hideLoading();
    }
}

function filterUnitLookupView(list, specificDisplayValueToShow, propertyColumnIndex) {
    // Check if the specific value is not null or undefined
    if (specificDisplayValueToShow) {
        // Iterate through each row in the table
        list.find("table tbody > tr").each(function () {
            var tr = $(this);
            var columnValue = tr.find('td').eq(propertyColumnIndex).text().trim();
            
            // Show or hide the row based on the comparison
            if (columnValue === specificDisplayValueToShow) {
                tr.show(); // Show the row if the column value matches the specific value
            } else {
                tr.hide(); // Hide the row otherwise
            }
        });
    }
}

function fetchPropertyHierarchy(unitId) {
    webapi.safeAjax({
        type: "GET",
        url: "/_api/flx_buildingunits(" + unitId + ")?$expand=flx_BuildingFloor($select=flx_buildingfloorid,flx_floor),flx_BuildingTable($select=flx_buildingtableid,flx_buildingid)",
        contentType: "application/json",
        headers: {
            "Prefer": "odata.include-annotations=*"
        },
        success: function (data, textStatus, xhr) {
            // Hide the loading indicator when the response is received
            hideLoading();
            debugger;
            var result = data;
            
            // Many To One Relationships
            if (result.hasOwnProperty("flx_BuildingFloor") && result["flx_BuildingFloor"] !== null) {
                var flx_BuildingFloor_flx_buildingfloorid = result["flx_BuildingFloor"]["flx_buildingfloorid"]; // Guid
                var flx_BuildingFloor_flx_floor = result["flx_BuildingFloor"]["flx_floor"]; // Text

                var flxBuildingFloorField = $("#flx_buildingfloor").val();
                if (!flxBuildingFloorField) {
                    populateLookupField("flx_buildingfloor", flx_BuildingFloor_flx_buildingfloorid, flx_BuildingFloor_flx_floor, "flx_buildingfloor");
                }
                hideLoading();
            }
            if (result.hasOwnProperty("flx_BuildingTable") && result["flx_BuildingTable"] !== null) {
                var flx_BuildingTable_flx_buildingtableid = result["flx_BuildingTable"]["flx_buildingtableid"]; // Guid
                var flx_BuildingTable_flx_buildingid = result["flx_BuildingTable"]["flx_buildingid"]; // Text

                var flxBuildingTableField = $("#flx_buildingtable").val();
                if (!flxBuildingTableField) {
                    populateLookupField("flx_buildingtable", flx_BuildingTable_flx_buildingtableid, flx_BuildingTable_flx_buildingid, "flx_buildingtable");
                }
                hideLoading();
            }
        },
        error: function (xhr, textStatus, errorThrown) {
            // Hide the loading indicator in case of an error
            hideLoading();
            console.log(xhr);
        }
    });
}

function fetchBuildingTable(floorValue) {
    // Make a fetch call for building table based on the floor value
    webapi.safeAjax({
        type: "GET",
        url: "/_api/flx_buildingfloors(" + floorValue + ")?$expand=flx_BuildingTable($select=flx_buildingtableid,flx_buildingid)",        
        contentType: "application/json",
        headers: {
            "Prefer": "odata.include-annotations=*"
        },
        success: function (data, textStatus, xhr) {
            hideLoading();

            var result = data;
            console.log(result);

            // Many To One Relationship
            if (result.hasOwnProperty("flx_BuildingTable") && result["flx_BuildingTable"] !== null) {
                var flx_BuildingTable_flx_buildingtableid = result["flx_BuildingTable"]["flx_buildingtableid"]; // Guid
                var flx_BuildingTable_flx_buildingid = result["flx_BuildingTable"]["flx_buildingid"]; // Text
                // Process the fetched data and populate the flx_buildingtable_name field
                populateLookupField("flx_buildingtable", flx_BuildingTable_flx_buildingtableid, flx_BuildingTable_flx_buildingid, "flx_buildingtable");
            }
        },
        error: function (xhr, textStatus, errorThrown) {
            hideLoading();
            console.log(xhr);
        }
    });
}


function checkValuesOnPage() {
    debugger;
    // Check if values are already present on the page
    var flxBuildingFloorField = $("#flx_buildingfloor").val();
    var flxBuildingTableField = $("#flx_buildingtable").val();

    return (flxBuildingFloorField && flxBuildingFloorField !== null && flxBuildingFloorField !== "") &&
           (flxBuildingTableField && flxBuildingTableField !== null && flxBuildingTableField !== "");
}

function checkPropertyValueOnPage() {
    debugger;
    // Check if values are already present on the page
    var flxBuildingTableField = $("#flx_buildingtable").val();

    return (flxBuildingTableField && flxBuildingTableField !== null && flxBuildingTableField !== "");
}

function showLoading() {
    // Show the loading indicator
    $("#loadingIndicator").show();
}

function hideLoading() {
    // Hide the loading indicator
    $("#loadingIndicator").hide();
}

function populateLookupField(lookupFieldId, entityId, entityName, entityLogicalName) {
    // Set the ID part of the lookup field
    $("#" + lookupFieldId).attr("value", entityId);

    // Set the entity name part of the lookup field
    $("#" + lookupFieldId + "_name").attr("value", entityName);

    // Set the entity type part of the lookup field
    $("#" + lookupFieldId + "_entityname").attr("value", entityLogicalName);
}

 

 

 

2 REPLIES 2

Hi @oml ,

 

Assuming the issue occurred only when you change Unit value not when you're changing Floor. As per my understanding, it seems to be some issue with fetchPropertyHierarchy() function. Try calling nullifyBuildingFloorField() before calling populateLookupField() function. Also, remove this highlighted condition.

 

saudali_25_0-1703022539597.png

 

Please give it a try and see if it works, if not better to add some console logs in your code so you may get exact idea at what point it is failing. Never mind if it doesn't work because I cannot debug this code. 

 

Thanks,

Saud

 

If you like this post, give a Thumbs up. Where it solved your request, Mark it as a Solution to enable other users find it.

Hi @saudali_25 ,

 

Thanks for your quick reply.

 

Adding the nullify function before populateLookup is breaking the logic even more because populateLookup is executed before the nullify function is complete.. I guess this is classic async javascript.. 🙂

 

However, I inspected the HTML DOM while doing the triggers, and here is what I found (unfortunately I didn't get any wiser... but maybe you see something) 

 

1. 

oml_0-1703064765031.png

2.

oml_1-1703064781953.png

 

3.

oml_2-1703064800313.png

4.

oml_3-1703064810950.png


So again, works first time. But not any attempts after that. Also did a console.log of the values being passed to the populateLookupField - which are correct:

oml_4-1703064933765.png

 

Helpful resources

Announcements

Community will be READ ONLY July 16th, 5p PDT -July 22nd

Dear Community Members,   We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd.   During this period, members will not be able to Kudo, Comment, or Reply to any posts.   On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities.   What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!

Summer of Solutions | Week 4 Results |Winners will be posted on July 24th

We are excited to announce the Summer of Solutions Challenge!    This challenge is kicking off on Monday, June 17th and will run for (4) weeks.  The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions to as many questions as you can. Answers can be provided in all the communities.    Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”)   - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024   Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods.  You must enter into each weekly Entry Period separately.   How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different.    Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers.  At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing.  Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner.  A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random.  Individuals will be contacted before the announcement with the opportunity to claim or deny the prize.  Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners.   Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event.   ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE**   Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 1: Community MembersSolutionsSuper UsersSolutionsPower Pages @Inogic  1   @ragavanrajan  2 @aofosu  1 @Jcook  1Open  @OliverRodrigues  1Open  @Lucas001  1Open Open    Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 2: Community MembersSolutionsSuper UsersSolutionsPower Pages @taraubianca25  2 @EmadBeshai  2 @ALP2  2@Fubar 2 @ekluth1  2@ragavanrajan 1 @mandela  1@OliverRodrigues 1 @Ajlan  1Open   @elishafxx  1    @TA_Jeremy  1    @helio1981  1       Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 3:Community MembersSolutionsSuper UsersSolutionsPower PagesInogic2@EmadBeshai 6Ajlan1@ragavanrajan 4CraigWarnholtz1@Fubar 4  @Jcook 3  @OliverRodrigues2   Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 4:Community MembersSolutionsSuper UsersSolutionsPower PagesHenryed071Fubar3Inogic1OliverRodrigues2JacoMathew1EmadBeshai2faruk11  TA_Jeremy1   shubhambhangale1   doug-ppc1   hubjes1  

Check Out | 2024 Release Wave 2 Plans for Microsoft Dynamics 365 and Microsoft Power Platform

  On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners.    The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights.    Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.    

Updates to Transitions in the Power Platform Communities

We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for.  We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer.   Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together.   Here's to new beginnings and endless possibilities!   If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport.   To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages