Sharepoint Rest Api in SPFX Update/Create taxonomy field value
Scenario - creating custom form for SPListItem, with stuff... all html/css/js/ts
When sending primitive values such as string/number/bool/choice, you just need to find the internal name of your field and give the actual value, example:
Title : "My Awesome Achievements!!"
to find the internal name just go to your SPList => list settings -> click your column => on the end of the URL you will find &Field=MyFieldInternalName
so if my field is named "My Best Quality" and you click that you should see something like "myBestQuality" and your code should send
{
Title : "My Awesome Achievements!!",
myBestQuality : "I Can Think!"
}
PS - the internal name can be very very different from the Display Name.
PS2 - the internal name be encoding like "_x8473_x8573", in that case your internal name is "odata__x8473_x8573"
When we want People columns we need to get the userId and send that while adding "Id" to the internal name like:
{
Title : "My Awesome Achievements!!",
myBestQuality : "I Can Think!",
projectManagerId: 148,
}
I wont get into how we get our list of users, but... use this endpoint "/_api/web/SiteUsers"
For TAXONOMY fields it gets interesting...
PS3 - get your taxo tree with this awesome code from git
Single Taxo need just the term guid
valueForRest = {
TermGuid: valueOfGuid,
WssId: -1
}
and then the body is
{
Title : "My Awesome Achievements!!",
myBestQuality : "I Can Think!",
projectManagerId: 148,
singleTaxoField: valueForRest,
}
and now for the real fun... TaxonomyFieldTypeMulti
first, you need the Hidden Name of the column which is a guid of sort, and can be acquired via the api like this
say i have a field named "My Coool Multi Taxo" (thats the display name!) i will go to this endpoint:
/sites/New-Proj/_api/web/lists/GetByTitle('My Coll List')/Fields/GetByTitle('My Coool Multi Taxo_0')/InternalName
that will retrieve something like "h01c0d38859b5538868471f40a78f4c4" and that is our column name for the body.
next, is how we build the value for this multi taxo, its like "'-1;#TermName|TermGuid;'" and seperated by #.
=======================================================
=======================================================
=======================================================
Let me show my final code, the HTML is rendered with angular, your can easily remake it in your TS, print the options with a for loop, and use "addEventListener" for "input" event.
<select multiple (input)="emitInput($event)">
<option value="" selected></option>
<option *ngFor="let c of plTaxo" [value]="c.guid" >{{c.name}}</option>
</select>
next creating the REAL value (the "h01c0d38859b5538868471f40a78f4c4" i took manually since i needed only 1). event is the JS event from the "select" element "input" event
emitInput(event: any) {
let terms = event.target.selectedOptions as HTMLCollection
value = ''
for (let i = 0; i < terms.length; i++) {
let t = terms[i] as HTMLOptionElement
value += `-1#;${t.text}|${t.value};#`
}
value = value.slice(0, -1)
this.myService.setValueToBody(
"h01c0d38859b5538868471f40a78f4c4", value )
}
BONUS my generic create item function:
HAVE FUN
Comments
Post a Comment