Learn how to create an interactive button to change status for a project/item in SharePoint
The challenge
If you have a list item (it could be a project) you probably have some stages for the specific project.
Having a standard choice field might help you to control the stages, but the user first have to open the info panel, and there is a risk that they don’t know or select the wrong, next stage
If the stages are not dynamic, we can use JSON formatting to create a button, that changes the status for the user

The solution
Step 1
Create a new choice column (not multi choice)
Note that the first name you give the column will be the internal name which we need for the json code.
I have created a new column with the name Stage and the following choices
- Initiation
- Planning
- Execution
- Closure
Step 2
If you have made the exact same column, with the same choices as me, you can copy-paste the below code.
If not, copy it into Visual Studio Code and make the nessesary changes as descriped in step 3

The JSON code
{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
"elmType": "div",
"style": {
"display": "=if(@currentField == '', 'none', 'flex')"
},
"children": [
{
"elmType": "div",
"attributes": {
"iconName": "ChromeBack",
"class": "=if(@currentField != 'Initiation','ms-fontColor-neutralPrimary ms-fontColor-themePrimary--hover', 'ms-fontColor-neutralLight')"
},
"style": {
"cursor": "pointer",
"padding-right": "4px",
"padding-top": "4px"
},
"customRowAction": {
"action": "setValue",
"actionInput": {
"Stage": "=if(@currentField == 'Closure', 'Execution', if(@currentField == 'Execution', 'Planning', if(@currentField == 'Planning', 'Initiation', @currentField)))"
}
}
},
{
"elmType": "div",
"children": [
{
"elmType": "div",
"style": {
"flex-direction": "row",
"display": "flex"
},
"children": [
{
"elmType": "div",
"style": {
"width": "100%",
"height": "26px",
"border-radius": "3px",
"align-items": "center",
"justify-content": "space-evenly",
"margin": "5px"
},
"attributes": {
"class": "ms-bgColor-themePrimary ms-bgColor-themeDarker--hover ms-fontColor-white ms-fontSize-12 ms-fontWeight-bold"
},
"children": [
{
"elmType": "div",
"style": {
"margin": "5px"
},
"txtContent": "@currentField"
}
]
}
]
}
]
},
{
"elmType": "div",
"children": [
{
"elmType": "div",
"attributes": {
"iconName": "ChromeBackMirrored",
"class": "=if(@currentField != 'Closure','ms-fontColor-neutralPrimary ms-fontColor-themePrimary--hover', 'ms-fontColor-neutralLight')"
},
"style": {
"cursor": "pointer",
"padding-right": "4px",
"padding-top": "4px"
},
"customRowAction": {
"action": "setValue",
"actionInput": {
"Stage": "=if(@currentField == 'Initiation', 'Planning', if(@currentField == 'Planning', 'Execution', if(@currentField == 'Execution', 'Closure', @currentField)))"
}
}
}
]
}
]
}
Step 3
To make the code work for your own column, and with your own choices do the following changes
Change 1
Line 22 and 80
Change Stage the the internal name of your column

Change 2
Line 12 change the word Initiation to the first choice/step in your stage

Change 3
Line 70 change the word Closure to the last choice/step in your stage

Change 4
Line 22 is your stage backwards so if the current stage is Closure then change to Execution, if Execution change to Planning and so on…"Stage": "=if(@currentField == 'Closure', 'Execution', if(@currentField == 'Execution', 'Planning', if(@currentField == 'Planning', 'Initiation', @currentField)))"
Change 5
Line 80 is your stage the other way around. Again if the current stage is Initiation change to Planning, if current stage is Planning change to Execution and so on…"Stage": "=if(@currentField == 'Initiation', 'Planning', if(@currentField == 'Planning', 'Execution', if(@currentField == 'Execution', 'Closure', @currentField)))"
We now have more control of the stages, and the user can now quickly change status by clicking the arrow.
