I might be experiencing either a bug, or I misunderstand something about general javascript syntax. Using ServiceNow UI Builder, I'm trying to refresh the datasource of a specific data visualization component. Which requires me to use setState and send in an entire JSON blob.
The following works as expected:
api.setState('intAssignedDonut', {
        "header": "Interactions assigned to one of my groups",
        "datasource": [{
            "isDatabaseView": false,
            "allowRealTime": true,
            "sourceType": "table",
            "label": {
                "message": "Interaction"
            },
            "tableOrViewName": "interaction",
            "filterQuery": "active=true^assignment_groupDYNAMICd6435e965f510100a9ad2572f2b47744",
            "id": "intAssigned",
            "elm": {}
        }],
        "metric": [{
            "dataSource": "intAssigned",
            "id": "intAssignedMetric",
            "aggregateFunction": "COUNT",
            "numberFormat": {
                "customFormat": false
            },
            "axisId": "primary"
        }],
        "groupBy": [{
            "maxNumberOfGroups": "ALL",
            "numberOfGroupsBasedOn": "NO_OF_GROUP_BASED_ON_PER_METRIC",
            "showOthers": false,
            "groupBy": [{
                "dataSource": "intAssigned",
                "groupByField": "state",
                "isRange": false,
                "isPaBucket": false
            }]
        }]
    });
However, I only need to alter a few properties, not the whole thing. So I thought I'd just clone the thing into a temp object, change what I need, then pass the cloned object back.
let clientState_intAssignedDonut = api.state.intAssignedDonut;
clientState_intAssignedDonut.header = 'Interactions assigned to one of my groups';
clientState_intAssignedDonut.datasource[0].filterQuery = 'active=true^assignment_groupDYNAMICd6435e965f510100a9ad2572f2b47744';
    
api.setState("intAssignedDonut", clientState_intAssignedDonut);
This seems to update the header properly, but the component doesn't refresh the datasource. Even if I console.log api.state.intAssignedDonut it looks identical to the whole JSON blob.
EDIT: I also tried using spread operators, but I can't figure out how to target the datasource[0]
api.setState("intAssignedDonut", {
        ...api.state.intAssignedDonut,
        header: "Interactions assigned to one of my groups",
        datasource[0].filterQuery: "active=true^assignment_groupDYNAMICd6435e965f510100a9ad2572f2b47744"
    });
 
    