Рефакторинг запроса на отдых в SPFx Web aprt - PullRequest
0 голосов
/ 04 апреля 2019

Я работал в веб-части, которая выбирает элементы из списка SP, а затем фильтрует или группирует эти результаты. Для каждого действия фильтра я отправляю новый запрос SP с 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
  });
});

}

и в файле поставщика данных у меня есть эти методы, каждый из которых делает запрос к 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, практически идентичен, единственное отличие - это параметр фильтра. Мне интересно, как я могу повторно использовать только один из этих методов отдыха, чтобы получить и отфильтровать данные с sharepoint?

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

1 Ответ

0 голосов
/ 04 апреля 2019

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

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,
});
...