This is a really interesting subject because there are a more than a few posts over the years... and just recently, regarding the isDirty state of a UX... and how to set it Clean manually. In the normal course of events you shouldn't need to do this... but we all know "normal" is not always the case.
The information here deals with both the Data Bound and Unbound UX. I'm not positive I've got all of it... but... it's a discussion.
There's a whole lot going on when a UX goes dirty... or clean.
This method does some of the job...
I believe this does the same as the following four statements...
But... doing only this part leaves the UX in an odd state... because the data control that is dirty, is still marked as dirty.
Rich mentioned ._setRowState and Frank mentioned .setAttribute for a5IsDirty... but these 2 need to be used together in order to return the UX to a clean state. NOTE... not the data... but rather the state of the UX.
Using ._setRowState by itself results in an odd looking behaviour: Make a control dirty, use ._setRowState, and then alter that same control again. The UX does not go dirty... because the a5IsDirty attribute for that control is already "true" and therefore it does not trigger the "dirty" process for the UX. The odd looking behaviour is that if you focus on another control after making your first control dirty again, then the UX does go dirty.
So... we need to alter all the "dirty" properties of the UX... and... alter all the "a5IsDirty" attributes of any dirty controls.
We know how to change the "dirty" properties... now how do we alter a5IsDirty?
If using a Data Bound UX we have the property {dialog.Object}._dataBoundControls. This is an Array of all the Data Bound Controls. We can loop through this array do the work.
For an Unbound UX we need to do something else. We can use the Object property {dialog.Object}.columnInfo. This is an Object of column Objects. We can loop through this Object grabbing the keys... which are the Column Names. We can push those names into an Array and then work on a5IsDirty.
A Data Bound UX also has {dialog.Object}.columnInfo so, actually, we can just use that for Data Bound or Unbound.
Looping through the Array of Column Names, we use $ga to get access to a5IsDirty. If it's "true" then we push that element into an Array of dirty elements.
Once we have our Array of dirty elements, we can use $sa to reset all the a5IsDirty attributes to false.
Doing this, the odd looking behaviour is now gone. You can alter the originally changed control... and the UX will go dirty again right away.
Here is the code for doing all this...
The end result is a Clean UX... with... changed data. We've now separated the two... as the UX no longer automatically knows that any data has been changed.
This is not something that Alpha would intend to do... but... Alpha let's us do some very cool things.
The information here deals with both the Data Bound and Unbound UX. I'm not positive I've got all of it... but... it's a discussion.
There's a whole lot going on when a UX goes dirty... or clean.
This method does some of the job...
Code:
{dialog.Object}._setRowState(1,false);
Code:
{dialog.Object}._isDataDirty = false; {dialog.Object}._isDirty = false; {dialog.Object}._dirtyRows[0] = false; {dialog.Object}.refreshClientSideComputations();
Rich mentioned ._setRowState and Frank mentioned .setAttribute for a5IsDirty... but these 2 need to be used together in order to return the UX to a clean state. NOTE... not the data... but rather the state of the UX.
Using ._setRowState by itself results in an odd looking behaviour: Make a control dirty, use ._setRowState, and then alter that same control again. The UX does not go dirty... because the a5IsDirty attribute for that control is already "true" and therefore it does not trigger the "dirty" process for the UX. The odd looking behaviour is that if you focus on another control after making your first control dirty again, then the UX does go dirty.
So... we need to alter all the "dirty" properties of the UX... and... alter all the "a5IsDirty" attributes of any dirty controls.
We know how to change the "dirty" properties... now how do we alter a5IsDirty?
If using a Data Bound UX we have the property {dialog.Object}._dataBoundControls. This is an Array of all the Data Bound Controls. We can loop through this array do the work.
For an Unbound UX we need to do something else. We can use the Object property {dialog.Object}.columnInfo. This is an Object of column Objects. We can loop through this Object grabbing the keys... which are the Column Names. We can push those names into an Array and then work on a5IsDirty.
A Data Bound UX also has {dialog.Object}.columnInfo so, actually, we can just use that for Data Bound or Unbound.
Looping through the Array of Column Names, we use $ga to get access to a5IsDirty. If it's "true" then we push that element into an Array of dirty elements.
Once we have our Array of dirty elements, we can use $sa to reset all the a5IsDirty attributes to false.
Doing this, the odd looking behaviour is now gone. You can alter the originally changed control... and the UX will go dirty again right away.
Here is the code for doing all this...
Code:
//take care of the UX dirty properties... setting them back to clean. {dialog.Object}._setRowState(1,false); //use the Data Bound UX _dataBoundControls to get an array of columns var columnNames = {dialog.Object}._dataBoundControls; //using a Data Bound or Unbound UX, you can also use the dialog object columnInfo //var columnNames = []; //for(var k in {dialog.Object}.columnInfo) columnNames.push(k); //now, loop through the columns and use $ga to get the a5IsDirty attriubte value //if a5IsDirty is "true" then add it to an array of dirty elements var dirtyEle = []; var isEleDirty; for(var i=0; i<columnNames.length; i++){ isEleDirty = $ga('{dialog.ComponentName}.V.R1.'+ columnNames[i],'a5IsDirty'); if(isEleDirty[0] == "true"){ dirtyEle.push('{dialog.ComponentName}.V.R1.'+ columnNames[i]) } } //if we have an array of dirty columns, use $sa to set the attriubte a5IsDirty to false for all the columns //$sa takes an Array of elements to work on. if(dirtyEle.length > 0){ $sa(dirtyEle,'a5IsDirty',"false"); }
This is not something that Alpha would intend to do... but... Alpha let's us do some very cool things.
Comment