Table of Contents

Поиск с выбором объекта в ПОЛИНОМ:MDM

Смотрите пример Polynom/SDK/Samples.Web/polynom-select-demo.

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

Перечисление типов объектов ПОЛИНОМ:MDM подлежащих выбору

/**
 * Типы данных объектов ПОЛИНОМ:MDM которые можно выбрать.
 */
export enum SelectPolynomObjectTypes {
  // Без типа.
  None = 0,

  // Элемент.
  Element = 4,

  // Группа.
  ElementGroup = 39,

  // Каталог.
  ElementCatalog = 40,

  // Справочник.
  Reference = 48,

  // Документ.
  Document = 71,

  // Каталог документов.
  DocumentCatalog = 69,

  // Группа документов.
  DocumentGroup = 70,

  // Каталог представлений.
  ViewpointCatalog = 91,

  // Группа представлений.
  ViewpointGroup = 92,

  // Представление.
  Viewpoint = 93
}

Структура данных справочника, каталога, группы.

/*
 * Данные идентифицирующие объект.
 */
export type IIdentifierData = {
  /* Идентификатор объекта. */
  identifier?: IIdentifiableObject;

  /* Строка расположения объекта. */
  location?: string;
};

Структура данных понятия.

/*
 * Данные идентифицирующие понятие.
 */
export type IConceptIdentifierData = {
  /* Идентификатор понятия. */
  identifier?: IIdentifiableObject;

  /* Абсолютный код понятия. */
  absoluteCode?: string;
};

Структура данных опций диалога поиска.

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

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

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

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

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

Структура данных получаемая при авторизации ПОЛИНОМ:MDM.

/**
 * Представляет данные авторизации ПОЛИНОМ:MDM.
 */
export type IPolynomAuthData = {
  /** Идентификатор сообщений ПОЛИНОМ:MDM. */
  messageId: string;

  /** Идентификатор хранилища. */
  storageId: string;

  /** Жетон доступа к ПОЛИНОМ:MDM. */
  accessToken: string;
};

Структура данных получаемая при выборе объекта в дереве классификации ПОЛИНОМ:MDM

/**
 * Представляет данные выбранного объекта ПОЛИНОМ:MDM.
 */
export type IPolynomObjectData = {
  /** Идентификатор сообщений ПОЛИНОМ:MDM. */
  messageId: string;

  /** Идентификатор объекта. */
  objectId: number;

  /** Идентификатор типа. */
  typeId: number;

  /** Строка расположения объекта.  */
  location: string;

  /** Признак применяемости */
  applicability: boolean;
};

Структура данных результата диалога выбора.

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

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

Настройка проекта перед использованием библиотеки **@ascon/polynom-select**

Создать проект с помощью NX

npx create-nx-workspace polynom-select-demo --preset=angular-standalone

Требуемые зависимости

{
  "dependencies": {
    "@ascon/polynom-select": "~24.0.30110",
    "@ascon/polynom-login": "~24.0.30110"
  }
}

Расположение библиотек **@ascon/polynom-select**, polynom-api и их зависимостей

Polynom/SDK/Samples.Web/libs/

Варианты доставки библиотек ASCON

  1. Вы можете опубликовать библиотеки в собственный локальный репозиторий npm пакетов и выполнить команды установки.
npm install @ascon/polynom-select@24.0.30110
npm install @ascon/polynom-login@24.0.30110
  1. Вы можете копировать библиотеки в **node_modules/@ascon** своего проекта из Polynom/SDK/Samples.Web/libs/ и установить транзитивные зависимости.
npm install
Подключить активы библиотек к своему проекту

В файл project.json добавить следующее:

{
  "targets": {
    "build": {
      "options": {
        "assets": [
          {
            "glob": "**/*",
            "input": "node_modules/@ascon/theme/assets",
            "output": "./assets"
          }, 
          {
            "glob": "**/*",
            "input": "node_modules/@ascon/polynom-api/assets",
            "output": "/assets"
          },          
          {
            "glob": "**/*",
            "input": "node_modules/@ascon/polynom-core/assets",
            "output": "./assets"
          },
          {
            "glob": "**/*",
            "input": "node_modules/@ascon/polynom-ui/assets",
            "output": "./assets"
          },
          {
            "glob": "**/*",
            "input": "node_modules/@ascon/polynom-trees/assets",
            "output": "./assets"
          },
          {
            "glob": "**/*",
            "input": "node_modules/@ascon/polynom-login/assets",
            "output": "./assets"
          },
          {
            "glob": "**/*",
            "input": "node_modules/@ascon/polynom-select/assets",
            "output": "./assets"
          }
        ],
        "styles": [
          {
            "input": "node_modules/@ascon/theme/theme.css",
            "inject": false,
            "bundleName": "theme"
          },          
          {
            "input": "node_modules/@ascon/polynom-theme/styles/polynom-theme.css",
            "inject": true,
            "bundleName": "app-styles"
          },
          {
            "input": "node_modules/@ascon/polynom-trees/styles/polynom-trees.css",
            "inject": true,
            "bundleName": "app-styles"
          },
          {
            "input": "node_modules/@ascon/polynom-ui/styles/polynom-ui.css",
            "inject": true,
            "bundleName": "app-styles"
          },
          {
            "input": "node_modules/@ascon/polynom-login/styles/polynom-login.css",
            "inject": true,
            "bundleName": "app-styles"
          }
        ]
      }
    }
  }
}

В файл index.html добавить следующее:

<html lang="ru">
  <head>
    <link
      href="theme.css"
      id="theme-link"
      media="all"
      onload="this.media='all'"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="app-styles.css"    
      id="app-link" 
      media="all"
      onload="this.media='all'"
      rel="stylesheet"
      type="text/css"
    />
  </head>
</html>
Импортировать модуль библиотеки PolynomSelectModule

Добавить строку providePolynomSelect() в appConfig.

//app.config.ts

export const appConfig: ApplicationConfig = {
  providers: [
    provideAnimations(),
    provideHttpClient(withInterceptors([jwtInterceptor])),
    provideStorages(),
    provideLocalization({
      availableLangs: ["ru", "en"],
      defaultLang: "ru",
      prodMode: !isDevMode(),
      scopes: [
        'polynom/polynom-select-demo',
        'polynom/polynom-api',
        'polynom/polynom-select',
        'polynom/polynom-login',
        'polynom/polynom-trees',
        'polynom/polynom-ui',
        'polynom/polynom-core'
      ],
    }),

    providePolynomSelect(),
    provideRouter(appRoutes),
  ],
};
Установить настройки адреса веб сервера ПОЛИНОМ:MDM

Перед запуском диалогового окна нужно установить настройки адреса веб сервера ПОЛИНОМ:MDM (например веб сервер ПОЛИНОМ:MDM работает на 127.0.0.1:5100)

// Параметры WEB API ПОЛИНОМ:MDM
const polynomApiConfig: PolynomApiConfig = inject(PolynomApiConfig);

polynomApiConfig.setHost("http://localhost:5100");

Или в компоненте из которого будет вызываться окно ПОЛИНОМ:MDM.

@Component({
  selector: "mdm-select-object",
  standalone: true,
  imports: [CommonModule],
  templateUrl: "./select-object.component.html",
  styleUrl: "./select-object.component.scss",
})
export class SelectObjectComponent implements OnInit, OnDestroy {
  // Сервис авторизации ПОЛИНОМ:MDM.
  private readonly _loginService: LoginService = inject(LoginService);

  public ngOnInit(): void {
    this._polynomApiConfig.setHost("http://127.0.0.1:5100");
  }
}

Примеры вызова поиска ПОЛИНОМ:MDM

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

Импорт классов, интерфейсов, сервисов.

import {
  IPolynomAuthData,
  IPolynomObjectData,
  SelectDialogs,
  SelectPolynomObjectTypes,
} from "@ascon/polynom-select";

import { 
  LoginService, 
  PolynomApiConfig, 
  IPropertySearchRequest 
} from "@ascon/polynom-api";

Получить экземпляры глобальных сервисов

// Сервис диалогов PrimeNg.
private readonly _dialogService: DialogService = inject(DialogService);

// Сервис конфигурации Polynom Web Api
private readonly _polynomApiConfig: PolynomApiConfig = inject(PolynomApiConfig);

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

Поля данных получаемых из диалога выбора объекта ПОЛИНОМ:MDM.

// Данные выбранного объекта ПОЛИНОМ:MDM.
private _polynomObject: IPolynomObjectData | null = null;

// Данные авторизации ПОЛИНОМ:MDM.
private _polynomAuthData: IPolynomAuthData | null = null;

Заполнить условие поиска.

Структура данных условия поиска совпадает с запросом метода /api/v1/search/execute-property-search

Для детального описания посмотрите статью поиск по свойствам.

private getPropertySearchRequest(): IPropertySearchRequest {
    return PropertySearchRequest.create({
      <Условие поиска>
    })
  }

Вызов окна выбора объекта ПОЛИНОМ:MDM

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

storageId необходим для указания хранилища.

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

// Список описаний хранилищ ПОЛИНОМ:MDM.
private _storageDefinitions: IStorageDefinition[] = [];

// Запрашивает список описаний хранилищ ПОЛИНОМ:MDM.
requestStorageDefinition(): void {
    this._loginService
        .getStorageDefinition()
        .pipe(take(1))
        .subscribe({
            next: storageDefinitions => {
                this.storageDefinitions = storageDefinitions;
            },
            error: err => {console.error(err);}
        });
}

// Авторизует пользователя в ПОЛИНОМ:MDM
signInByPassword(storageId: string, login: string, password: string): void {
    if (!storageId || !login || !password) {
        return;
    }

    const request = SignInRequest.create({
        storageId: storageId,
        login: login,
        password: password,
        clientType: this._polynomWebApiConfig.clientType,
        moduleName: "Клиент ПОЛИНОМ:MDM" // Опционально
    });

    this._loginService
        .signIn(request)
        .pipe(take(1))
        .subscribe({
            next: () => {
                // Действия после успешной авторизации
            },
            error: err => {console.error(err);}
        });
}


// Открывает диалог выбора объекта ПОЛИНОМ:MDM с установлеными значениями **storageId** **accessToken**.
// Окно заблокирует выбор хранилища указанным в **storageId** и попытается авторизоватся с помощью уже существующего **accessToken**.
searchWithCondition($event: MouseEvent): 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 = value;
        }
      });
}