According to mentioned code it removes Rows (Deactivates some records) but re
a!localVariables( local!pagingInfo: a!pagingInfo( startIndex: 1, batchSize: 5, sort: a!sortInfo(field: "userName", ascending: true) ), local!Members: cast( 'type!{urn:com:appian:types:WFM}WFM_Test?list', rule!WFM_getTestByTestId(testId: ri!testId) ), { a!gridField( label: "Member List", labelPosition: if(ri!showLabel,"ABOVE","COLLAPSED"), data: local!Members, refreshAlways: true(), refreshAfter: "RECORD_ACTION", columns: { a!gridColumn( label: "Member Name", sortField: "userName", value: a!forEach( items: fv!row.userName, expression: rule!OCO_getUserFullNameFromUserName(userName: fv!item) ) ), a!gridColumn( label: "Remove", showWhen: not(ri!readOnly), value: a!richTextDisplayField( value: a!forEach( items: fv!row.MemberId, expression: a!richTextIcon( icon: if( contains(ri!removedMemberIds, tointeger(fv!item)), "check-square-o-alt", "square-o" ), altText: if( contains(ri!removedMemberIds, tointeger(fv!item)), "Undo Removal", "Mark for Removal" ), caption: if( contains(ri!removedMemberIds, tointeger(fv!item)), "Undo Removal", "Mark for Removal" ), link: a!dynamicLink( saveInto: { a!save( ri!removedMemberIds, if( contains(ri!removedMemberIds, tointeger(fv!item)), remove( ri!removedMemberIds, wherecontains(tointeger(fv!item), ri!removedMemberIds) ), append(ri!removedMemberIds, fv!item) ) ) } ), color: if( contains(ri!removedMemberIds, tointeger(fv!item)), "NEGATIVE", "SECONDARY" ), size: "MEDIUM" ) ) ), width: "NARROW", align:"CENTER" ) }, pageSize: local!pagingInfo.batchSize, showWhen: a!isNotNullOrEmpty(ri!testId) ) } )
Discussion posts and replies are publicly visible
As per your code, you are trying to refresh the grid data by record action and refresh always to true but the refresh after will work if you are using records as a data. so now as you may are using query entity so on your local variable you have to use refresh variable and refresh always to true under your refresh variable configurations.