We've updated the ServiceNow Community Code of Conduct, adding guidelines around AI usage, professionalism, and content violations. Read more

Workspace Form Controller - How to expand returned data for recordMembers?

Jorogumo4
Kilo Guru

Hey all, I've been trying to research this, but I'm not able to figure it out...

How do we go about adding more data to the form controller > form > recordMembers array? 

Jorogumo4_0-1770918952649.png

I'd love to have phone number setup in here as well, not sure why it's not by default. 

1 REPLY 1

lauri457
Tera Sage

The form controller output is mapped from the form controller state params. 

            "recordMembers": {
                "binding": {
                    "address": [
                        "recordMembers"
                    ]
                },
                "type": "STATE_BINDING"
            },

The state param is filled from the glide_form_1 data source. Client script Initialize mentions users:

Spoiler
/**
*  {params} params
*  {api} params.api
*  {any} params.event
*  {any} params.imports
*  {ApiHelpers} params.helpers
*/
function handler({api, event, helpers, imports}) {
    // Create a map to store unique record members
    let recordMembersMap = new Map();
    const fields = api.data?.glide_form_1?.nowRecordFormBlob?.fields;
    const activityStreamMembers = api.data?.glide_form_1?.nowActivityStreamConnected?.userReferences;
    //Store Activity Stream members in recordMembers
    activityStreamMembers.length > 0 && activityStreamMembers.forEach(activityMember => {
        const { sysId, displayName, userName, ...rest } = activityMember;
        recordMembersMap.set(sysId, {
            sys_id: sysId,
            name: displayName,
            username: userName,
            ...rest
        });
    });
    // Store users as recordMembers from field of type reference, with reference to sys_user table
    Object.keys(fields).forEach(function(key,index) {
        const field = fields[key];
        // For glide_list, extract each sys_id
        if(field.type === 'glide_list' && field.reference === 'sys_user' && field.display_value_list.length > 1 ) {
            const sys_ids = field.value.split(',');
            field.display_value_list.forEach((name, index) => {
                recordMembersMap.set(
                    sys_ids[index], 
                    { ...(recordMembersMap.get(sys_ids[index]) || {}),
                        ...{
                            "sys_id": sys_ids[index],
                            "name": name
                        }
                    }
                );
            });
        }
        else if (field.reference === 'sys_user' && field.value) {
            recordMembersMap.set(
                field.value,
                { ...(recordMembersMap.get(field.value) || {}), 
                    ...{
                        "sys_id": field.value,
                        "name": field.displayValue
                    }
                }
            );
        }
    });
    
   const recordMembers = Array.from(recordMembersMap.values());
   api.setState('recordMembers',  recordMembers , false);
}

The data source is [sys_ux_data_broker_proxy] with sysid: "dc6e87a5232200100e4bc50947bf654b". Now what a proxied data broker is I have no idea. I am guessing this data source gets its data from other components in some way. Maybe someone more experienced in uib knows

 

The activity stream component (root component now-activity-stream-connected) dispatches an event called NOW_ACTIVITY_STREAM_CONNECTED#AUTHORS_UPDATED which probably helps if you need to keep the list updating live

/sys_ux_lib_component.do%3Fsys_id%3D4f6f089446890030a5b1f67b340c41f4


I doubt you can alter this exactly but it doesn't mean you can't query and store this information in other manners

 

 

Activity Stream | Horizon Design System

Unlock Modern Horizon Design System Components In Your Custom Components Using -fetch-assets-from-instance - DylanLindgren.com