Рефакторинг запроса rest в SPFx Web aprt

#rest #spfx

#rest #spfx

Вопрос:

Я работал в веб-части, которая извлекает элементы из списка SP, а затем фильтрует или группирует эти результаты. Для каждого действия фильтра я отправляю новый запрос в SP с помощью Rest и использую код rest для возврата отфильтрованных элементов и отображения их в веб-части. Прямо сейчас у меня есть два действия фильтра, запускаемые событиями onClick.

Каждое действие выглядит следующим образом: Фильтровать по закрытым соглашениям:

 private getEnded(): void {
this.props.provider.getEnded().then((originalitems: IList[]) => {

  this.setState({
    filteredListItems: originalitems,
    filter: true
  });
});
  

}

и для фильтрации по прошедшему последнему дню:

  private getPassed(): void {
this.props.provider.getPassed().then((originalitems: IList[]) => {
  this.setState({
    filteredListItems: originalitems,
    filter: true
  });
});
  

}

и в файле dataprovider у меня есть эти методы, каждый из них отправляет запрос в SharePoint, единственное отличие — параметр фильтра:

Для получения закрытых соглашений (вызывается из метода getEnded()):

 public async getEnded(): Promise<IList[]> {
let today = new Date();
let Agreements: IList[] = [];

const items = await sp.web.lists
  .getByTitle("AgreementDatabase")
  .items.select(this.select)
  .filter(
    `(AgreementEnded eq true) and (AgreementEndDate le '${today.toISOString()}')`
  )
  .expand("SalesManager,TaxCatchAll,FrameworkAgreement")
  .get();

items.forEach(item => {
  Agreements.push({
    Title: item.Title,
    Id: item.Id,
    CustomerAgreementNr: item.CustomerAgreementNr,
    AgreementType: item.AgreementType,
    Customer: item.TaxCatchAll[0].Term,
    FrameworkAgreement: item.FrameworkAgreement.Title,
    ContactPerson: item.ContactPerson,
    SalesManager: item.SalesManager.FirstName   " "   item.SalesManager.LastName,
    DeliveryType: item.DeliveryType,
    AgreementStartDate: item.AgreementStartDate,
    AgreementEndDate: item.AgreementEndDate,
    AgreementEnded: item.AgreementEnded,
    LastPriceAdjustment: item.LastPriceAdjustment,
    NextPriceAdjustment: item.NexPriceAdjustment,
  });
});

return new Promise<IList[]>(async resolve => {
  resolve(Agreements);
});
  

}

и для получения переданных соглашений (вызывается из метода getPassed()):

 public async getPassed(): Promise<IList[]> {
let today = new Date();
let Agreements: IList[] = [];


const items = await sp.web.lists
  .getByTitle("AgreementDatabase")
  .items.select(this.select)
  .filter(`LastPriceAdjustment le '${today.toISOString()}'`)
  .expand("SalesManager,TaxCatchAll,FrameworkAgreement")
  .get();

items.forEach(item => {
  Agreements.push({
    Title: item.Title,
    Id: item.Id,
    CustomerAgreementNr: item.CustomerAgreementNr,
    AgreementType: item.AgreementType,
    Customer: item.TaxCatchAll[0].Term,
    FrameworkAgreement: item.FrameworkAgreement.Title,
    ContactPerson: item.ContactPerson,
    SalesManager: item.SalesManager.FirstName   " "   item.SalesManager.LastName,
    DeliveryType: item.DeliveryType,
    AgreementStartDate: item.AgreementStartDate,
    AgreementEndDate: item.AgreementEndDate,
    AgreementEnded: item.AgreementEnded,
    LastPriceAdjustment: item.LastPriceAdjustment,
    NextPriceAdjustment: item.NexPriceAdjustment,
  });
});

return new Promise<IList[]>(async resolve => {
  resolve(Agreements);
});
  

}

Как вы можете видеть, метод запроса информации из SP практически идентичен, единственное отличие заключается в параметре фильтра. Мне интересно, как я могу повторно использовать только один из этих методов rest для извлечения и фильтрации данных из sharepoint?

С наилучшими пожеланиями, Америко

Ответ №1:

Вы можете написать один метод и передать файл:

 private getEnded(): void {
const filter = `(AgreementEnded eq true) and (AgreementEndDate le '${today.toISOString()}')`;
this.props.provider.getAgreements(filter).then((originalitems: IList[]) => {

  this.setState({
    filteredListItems: originalitems,
    filter: true
  });
});



 private getPassed(): void {
const filter = `LastPriceAdjustment le '${today.toISOString()}'`;
    this.props.provider.getAgreements(filter).then((originalitems: IList[]) => {
      this.setState({
        filteredListItems: originalitems,
        filter: true
      });
    });

public async getAgreements(filterAgreements: string): Promise<IList[]> {
let today = new Date();
let Agreements: IList[] = [];

const items = await sp.web.lists
  .getByTitle("AgreementDatabase")
  .items.select(this.select)
  .filter(filterAgreements)
  .expand("SalesManager,TaxCatchAll,FrameworkAgreement")
  .get();

items.forEach(item => {
  Agreements.push({
    Title: item.Title,
    Id: item.Id,
    CustomerAgreementNr: item.CustomerAgreementNr,
    AgreementType: item.AgreementType,
    Customer: item.TaxCatchAll[0].Term,
    FrameworkAgreement: item.FrameworkAgreement.Title,
    ContactPerson: item.ContactPerson,
    SalesManager: item.SalesManager.FirstName   " "   item.SalesManager.LastName,
    DeliveryType: item.DeliveryType,
    AgreementStartDate: item.AgreementStartDate,
    AgreementEndDate: item.AgreementEndDate,
    AgreementEnded: item.AgreementEnded,
    LastPriceAdjustment: item.LastPriceAdjustment,
    NextPriceAdjustment: item.NexPriceAdjustment,
  });
});

return new Promise<IList[]>(async resolve => {
  resolve(Agreements);
});
  

Другое улучшение:

Вы можете использовать .map() вместо .foreach()

 Agreements = items.map(item => {
    Title: item.Title,
    Id: item.Id,
    CustomerAgreementNr: item.CustomerAgreementNr,
    AgreementType: item.AgreementType,
    Customer: item.TaxCatchAll[0].Term,
    FrameworkAgreement: item.FrameworkAgreement.Title,
    ContactPerson: item.ContactPerson,
    SalesManager: item.SalesManager.FirstName   " "   item.SalesManager.LastName,
    DeliveryType: item.DeliveryType,
    AgreementStartDate: item.AgreementStartDate,
    AgreementEndDate: item.AgreementEndDate,
    AgreementEnded: item.AgreementEnded,
    LastPriceAdjustment: item.LastPriceAdjustment,
    NextPriceAdjustment: item.NexPriceAdjustment,
});