I am new to SPFX. I am trying to build a web part property pane where there are 2 dropdowns. one has the lists in the current site and another one will populate the items inside the list selected in the dropdown.
Following is my code I am not getting anything in the second dropdown
import * as React from 'react';
import * as ReactDom from 'react-dom';
import { Version } from '@microsoft/sp-core-library';
import {
IPropertyPaneConfiguration,
PropertyPaneTextField,PropertyPaneDropdown,IPropertyPaneDropdownOption
} from '@microsoft/sp-property-pane';
import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';
import{SPHttpClient,SPHttpClientResponse } from '@microsoft/sp-http';
import * as strings from 'ThewebpartWebPartStrings';
import Thewebpart from './components/Thewebpart';
import { IThewebpartProps } from './components/IThewebpartProps';
export default class ThewebpartWebPart extends BaseClientSideWebPart<IThewebpartProps> {
private _siteLists:string[];
private alllistitems:IPropertyPaneDropdownOption[];
private itemsDropdownDisabled: boolean = true;
public render(): void {
const element: React.ReactElement<IThewebpartProps> = React.createElement(
Thewebpart,
{
description: this.properties.description,
webURL:this.context.pageContext.web.absoluteUrl,
sitelist:this.properties.sitelist,
listitems:this.properties.listitems
}
);
ReactDom.render(element, this.domElement);
}
private async _getSiteLists():Promise<string[]>{
const endpoint: string = `${this.context.pageContext.web.absoluteUrl}/_api/web/lists?$select=Title%20&$filter=Hidden eq false &$orderby=Title &$top=10`;
const rawResponse:SPHttpClientResponse= await this.context.spHttpClient.get(endpoint,SPHttpClient.configurations.v1);
return (await rawResponse.json()).value.map(
(list:{Title:string})=>{
return list.Title;
}
);
}
private async _getlistitems(listname:string):Promise<string[]>{
console.log("items")
const endpoint:string=`${this.context.pageContext.web.absoluteUrl}/_api/lists/GetByTitle('${listname}')/items?$select=Title`;
const rawResponse:SPHttpClientResponse=await this.context.spHttpClient.get(endpoint,SPHttpClient.configurations.v1);
console.log(endpoint);
return(await rawResponse.json()).value.map(
(list:{Title:string})=>{
return list.Title;
}
);
}
protected onPropertyPaneFieldChanged(propertyPath: string, oldValue: any, newValue: any): void {
if(propertyPath='listitems' && newValue)
{
this.itemsDropdownDisabled=false;
const allistitems= this._getlistitems(propertyPath);
super.onPropertyPaneFieldChanged(propertyPath,oldValue,newValue);
this.context.propertyPane.refresh();
this.render();
}
else{
console.log("oldvalue");
super.onPropertyPaneFieldChanged(propertyPath,oldValue,oldValue);
console.log("oldvalue::" + oldValue);
}
}
protected async onInit(): Promise<void> {
this._siteLists=await this._getSiteLists();
return super.onInit();
}
protected onDispose(): void {
ReactDom.unmountComponentAtNode(this.domElement);
}
protected get dataVersion(): Version {
return Version.parse('1.0');
}
protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
return {
pages: [
{
header: {
description: strings.PropertyPaneDescription
},
groups: [
{
groupName: strings.BasicGroupName,
groupFields: [
PropertyPaneTextField('description', {
label: strings.DescriptionFieldLabel
}),
PropertyPaneDropdown('sitelist',{
label:'Lists in Current Site',
options:this._siteLists.map((list:string)=>{
return<IPropertyPaneDropdownOption>{key:list,text:list}
})
}),
PropertyPaneDropdown('listitems',{
label:'Selected Items',
options:this.alllistitems,
disabled:this.itemsDropdownDisabled
})
]
}
]
}
]
};
}
}
The second dropdown is visible but it doesn't have any items inside. when I look at the console this is what I get the allitems lists value returns alllsititemsare:[object Promise]