Table of Contents

Поиск с выбором объекта

См. пример SDK/Web/Samples/Client/polynom-select-demo.

Окно поиска открывается функцией SearchDialog.show() из библиотеки @ascon/polynom-select. Оно представляет собой то же окно ПОЛИНОМ:MDM, что и SelectDialog, но с включённым режимом поиска (searchMode: true).

Общий каталог структур данных (SelectPolynomObjectTypes, IFilterContainer, IIdentifierData, IPolynomObjectData, IAuthDataResponse и других) приведён в статье Выбор объекта из ПОЛИНОМ:MDM. Ниже описаны типы, специфичные для поиска.

Структуры данных

Структура данных опций диалога поиска (пакет @ascon/polynom-select):

/**
 * Параметры диалога поиска объекта.
 */
export type ISearchDialogOption = {
  /* Идентификатор хранилища. */
  storageId: string | null;

  /* Токен доступа. */
  accessToken: string | null;

  /* Данные фильтра. */
  condition: IPropertySearchRequest;

  /* Режим только для просмотра. */
  readonly: boolean;

  /** Признак режима множественного выбора. */
  multiselectMode: boolean;

  /* Режим учета применяемости. */
  useApplicability: boolean;
};

Тип IPropertySearchRequest объявлен в библиотеке @ascon/polynom-api-client. Структура условия поиска совпадает с телом запроса метода /api/v1/search/property-search-result; полное описание приведено в статье Поиск по свойствам.

Структура данных результата диалога поиска:

/**
 * Представляет результата выбора.
 */
export type ISearchDialogResult = {
  /**
   * Данные выбранного объекта.
   */
  polynomObject: IPolynomObjectData | null;

  /**
   * Данные выбранных объектов.
   */
  polynomObjects: IPolynomObjectData[];
};

Настройка проекта

Зависимости:

{
  "dependencies": {
    "@ascon/core": "24.1.126",
    "@ascon/polynom-api": "~24.1.14404",
    "@ascon/polynom-api-client": "~24.1.14404",
    "@ascon/polynom-integration": "~24.1.14404",
    "@ascon/polynom-login": "~24.1.14404",
    "@ascon/polynom-select": "~24.1.14404",
    "@ascon/primeng": "24.0.2",
    "@ascon/qwebchannel-bridge": "^6.8.3",
    "@ascon/ui": "24.1.126"
  }
}

Провайдер providePolynomSelect(), настройка адреса web-сервера и подключение активов описаны в разделе «Настройка проекта перед использованием библиотеки @ascon/polynom-select» статьи Выбор объекта из ПОЛИНОМ:MDM.

Примеры вызова поиска

Подготовка компонента

import { ChangeDetectionStrategy, Component, inject, signal } from "@angular/core";
import { LoginService } from "@ascon/polynom-api";
import { IPropertySearchRequest } from "@ascon/polynom-api-client";
import { ISearchDialogResult, SearchDialog } from "@ascon/polynom-select";
import { DialogService } from "@ascon/primeng/dynamicdialog";
import { UiModule } from "@ascon/ui";
import { take } from "rxjs";
// Сервис диалогов.
private readonly _dialogService: DialogService = inject(DialogService);

// Сервис авторизации ПОЛИНОМ:MDM.
private readonly _loginService: LoginService = inject(LoginService);

// Результат поиска.
searchObjectResult = signal<ISearchDialogResult | null>(null);

Поиск без предварительного условия

Если условие не задано, окно открывается в режиме поиска по дереву классификации:

search(): void {
  SearchDialog.show(this._dialogService, {
    accessToken: this._loginService.accessToken
  })
    .pipe(take(1))
    .subscribe({
      next: (value) => {
        if (!value?.polynomObject) {
          return;
        }

        this.searchObjectResult.set(value);
      }
    });
}

Поиск с условием

Условие поиска задаётся в свойстве condition и повторяет структуру запроса /api/v1/search/property-search-result (см. Поиск по свойствам):

searchWithCondition(): void {
  SearchDialog.show(this._dialogService, {
    accessToken: this._loginService.accessToken,
    condition: this.getPropertySearchRequest()
  })
    .pipe(take(1))
    .subscribe({
      next: (value) => {
        if (!value?.polynomObject) {
          return;
        }

        this.searchObjectResult.set(value);
      }
    });
}

private getPropertySearchRequest(): IPropertySearchRequest {
  return {
    pageNumber: 1,
    pageSize: 100,
    ownerScope: {
      objectId: 10,
      typeId: 48
    },
    condition: {
      enabled: true,
      intersectionType: 0,
      complexConditions: [],
      elementConditions: [],
      propValueConditions: [],
      simpleConditions: [
        {
          enabled: true,
          searchConditionTargetQualifier: {
            objectId: 37,
            typeId: 54
          },
          definition: null,
          operation: 3,
          options: 0,
          value: {
            typeId: 0,
            objectId: 0
          }
        }
      ]
    },
    values: {
      stringProperties: [
        {
          objectId: 0,
          typeId: 9,
          value: "Рым-болт"
        }
      ],
      tableProperties: []
    }
  };
}

Множественный выбор

Для включения множественного выбора укажите multiselectMode: true; результат доступен в поле polynomObjects:

searchMultiple(): void {
  SearchDialog.show(this._dialogService, {
    accessToken: this._loginService.accessToken,
    condition: this.getPropertySearchRequest(),
    multiselectMode: true
  })
    .pipe(take(1))
    .subscribe({
      next: (value) => {
        if (value.polynomObjects.length === 0) {
          return;
        }

        this.searchObjectsResult.set(value.polynomObjects);
      }
    });
}

Вызов окна поиска с предварительной авторизацией

accessToken может быть получен из общего сервиса авторизации или из web api ПОЛИНОМ:MDM. storageId необходим для указания хранилища. Окно зафиксирует указанное хранилище и попытается авторизоваться с помощью уже существующего accessToken.

searchWithConditionAuthorized(): void {
  SearchDialog.show(this._dialogService, {
    storageId: this._loginService.storageId,
    accessToken: this._loginService.accessToken,
    condition: this.getPropertySearchRequest()
  })
    .pipe(take(1))
    .subscribe({
      next: (value) => {
        if (!value?.polynomObject) {
          return;
        }

        this.searchObjectResult.set(value);
      }
    });
}