Журнал технических изменений

Версия 6.12

Валидация спецсимволов в External Id

Изменен парсинг external key. Разрешено использование пробелов в External Id.

Уведомление о сроке окончания лицензии

  • @universe/license - в LicenseManager добавлен метод getIsSoonExpire, проверяющий, скоро ли окончится действие лицензии.

  • @universe-ee/base-app - loginHandler после успешной авторизации запускает проверку срока действия лицензии и отображает уведомление о скором окончании.

  • @universe-platform/app - создание loginHandler вынесено в отдельный метод getLoginHandler, чтобы можно было переопределять его из дочернего класса.

Связи типа "Включение" удалены из uPath в "Качестве данных"

К uPath input в DQ был добавлен новый фильтр UPathMdmFilters.disallowRelationType(disallowRelType?:string), который удаляет из typeName возможность выбрать связь "Включение".

uPath в "Правилах сопоставления" остался без изменений.

Точка расширения InnerCompareStore

  • В релизе 6.12 удалена точка расширения InnerCompareStore.

Виджет "Черновики" на главной странице

FE:

  • Добавлен новый запрос POST ReadMultiDraftListOp.

  • В запрос ReadDraftListOp добавлено два ключа - owner и state.

BE:

  • Расширено API: новый endpoint v2/draft/multidrafts.

Режим вставки комплексного атрибута (PATCH)

org.unidata.mdm.rest.v2.data:

  • Добавлен флаг patch в UpsertRequestRO, отвечающий за частичное обновление атрибутов записи.

org.unidata.mdm.data:

  • Реализован функционал для частичного обновления комплексных атрибутов.

UI UX: Экрана настройки БП

@universe-platform/uikit

  • Поправлено поведение компонента Resizer, если он расположен с левой стороны от масштабируемого контейнера.

@universe-ee/workflow

  • Появилась функция масштабирования и сворачивания панели редактирования параметров бизнес-процесса.

  • Были поправлены некоторые визуальные дефекты на экране бизнес-процесса.

Запуск Tomcat в контейнере BE MDM от пользователя tomcat

  • Реализован запуск tomcat в контейнере от пользователя tomcat. Права "root" в контейнере BE MDM больше не требуются.

Импорт/экспорт потоков выполнения

Для поддержания возможности импорта/экспорта потоков выполнения в разделе "Импорт/Экспорт" был расширен API новыми эндпоинтами:

  • Эндпоинт для импорта потоков выполнения из файла: v2/core/system/pipeline/import. Формат файла JSON. Файл передается в теле запроса, также передается флаг recreate, который помечает, нужно ли пересоздание потоков.

  • Эндпоинт для экспорта потоков выполнения: v2/core/system/pipeline/export. Формат файла JSON.

Удаление связей в meta-data-driven

В тело запроса на обновление записи было добавлено поле relationsDeletes. В тело ответа для связи было добавлено поле etalonId.

  • com.universe.mdm.metadriven.core:

  • В RecordInputRO добавлено поле relationsDeletes;

  • В RelationOutputRO добавлено поле etalonId.

Эксплуатация приложения без прав superuser для БД

  • Права суперпользователя больше не требуются для установки приложения.

Удаленные API

Удалено Deprecated API:

  • TagsRestService#deprecatedDelete(DeleteTagsRequestRO):

    • DELETE /v2/core/tags/delete

    • DELETE /v2/search/tags/delete

    • DELETE /v1/marks/tags/delete

  • UserNotificationsRestService#getUserNotifications:

    • /v2/core/user/notifications/{p:/?}{date: (([0-9T-:.]{23})?)}

  • RoleRestService#getAllSecurityLabels (до этого был скопирован в SecurityLabelRestService):

    • /v2/core/security/role/get-all-security-labels

Удалены следующие методы и поля:

  • XLSXProcessor#RELATION_TITLE_LABEL

  • XLSXProcessor#ENTITY_TITLE_LABEL

  • XLSXProcessor#LOOKUP_ENTITY_TITLE_LABEL

  • XLSXProcessor#COMPLEX_TO_NESTED_DISPLAY_NAMES_DELIMITER

  • XLSXProcessor#buildSheetName

  • XLSXProcessor#identifySheet

  • XlsxImportState#withNested

  • ClassificationImportXlsxRenderingComponent#identifySheet

  • ClassificationImportXlsxRenderingComponent#isEmptyRow

  • ClassificationImportXlsxRenderingComponent#convertToString

  • ClassificationImportXlsxRenderingComponent#getExcelCoordinates

  • ClassificationImportXlsxRenderingComponent#normalizeTo

Покрытие тестами класса SearchFormFieldDeserializer

  • Добавление searchType по умолчанию для запросов без searchType. Для запроса имеющего узел value/values устанавливается searchType = EXACT, для запроса имеющего узел range устанавливается searchType = RANGE.

  • Запрет передачи значения null в качестве имени искомого атрибута name: null.

  • Замена npe при невалидном значении типа искомого атрибута type: someWrongType на читаемый JsonMappingException с сообщением "Types other then simple types [ someWrongType ] aren't supported.".

  • Замена IllegalArgumentException при передаче невалидного типа поиска searchType: someWrongType на читаемый JsonMappingException с сообщением "Unsupported search type [ someWrongType ]".

  • Обработка исключения отсутствия всех значений value, values и range. Если в запросе нет ни value, ни values, ни range, то будет брошен JsonMappingException с сообщением "Requires single 'value' or 'value_s_' or 'range' node.".

  • Запрет одновременного использования флагов like, startWith, fuzzy, morphological. Можно установить в true только один из данных флагов, т.к. каждый из флагов переписывает searchType.

  • Установка searchType == EXIST в случае когда запрос делается по values, без searchType и values is Null.

  • Понижение приоритета флага like. Если все значения запроса пусты, searchType устанавливается в EXIST, а значение like игнорируется.

  • При searchType == RANGE, если значение range отсутствует, бросается JsonMappingException с сообщением "Range search type must contain a range node".

  • Если range: null, бросается JsonMappingException с сообщением "Range node must be an array". range всегда должен быть массивом.

  • Если searchType == START_WITH или searchType == MORPHOLOGICAL или searchType == LIKE, но тип искомого значения не равен STRING, CLOB или BLOB, бросается JsonMappingException с сообщением *"START_WITH/MORPHOLOGICAL/LIKE search type cannot be applied to a value of type typename".

Прочие изменения:

AttributeUtils#toDate, AttributeUtils#toTimestamp, AttributeUtils#toTime, AttributeUtils#toInstant исправлено внутреннее сообщение сервера, в соответствии с сообщением из файлов properties.

Исправление срабатываний анализатора Svacer

Возвращаемый тип DataTableFormatter#zip изменен с InputStream на File, т.к. InputStream может быть не закрыт в дальнейшем.

Новая проверка состава Бизнес ключа в процессах

  • Убрана проверка, которая не позволяла хранить в ключе ничего кроме namespace и draftId.

  • Добавлена проверка на корректность, в случае, если у БП есть linkedSubjectId и linkedTypeName тогда ключ обязательно должен начинаться c namespace и draftId, далее может быть что угодно, главное присутствие namespace и draftId.

  • Пример: register:test:draftId:148:кастомноеполе1:кастомноеполе2

  • Переделана логика нахождения процессов по бизнес ключу: теперь процесс находится по draftId внутри бизнес ключа, так как в бизнес ключе теперь могут быть пользовательские поля.

Внутренние изменения логики сравнения записей

Реализован новый стор для сравнения записей - RecordsCompareStore.

В нем посредством user-exit-a UEInnerCompareStore подключаются внутренние сторы сравнения. Каждый внутренний стор реализует логику сравнения для своего пространства имен: генерирует колонки, строит diff-ы, определяет внешний вид колонок.

Колонки в сравнении делятся на два типа: мета-колонки и дата-колонки. Мета-колонки отображаются в панели настроек, а дата-колонки в самой таблице. На одну мета-колонку может приходиться несколько дата-колонок либо дата-колонок может не быть вовсе (пример: колонки классификатора).

Поскольку каждое окно сравнения записей может иметь уникальные методы загрузки данных и уникальное отображение ячеек таблиц, был реализован глобальный интерфейс UniverseCompare, который хранит следующие типы:

  • ICompareTypeArgsMap - Объект, объявляющий тип сравнения (ключ объекта) и параметры, использующиеся для загрузки данных этого типа сравнения;

  • INamespaceLoadResultMap - Объект, объявляющий тип возвращаемых после загрузки значений для каждого пространства имён.

  • CompareType - тип, содержащий все виды сравнения.

Тип сравнения - один из параметров конструктора RecordsCompareStore. Каждый тип сравнения имеет свои аргументы загрузки данных. В параметры конструктора стора сравнения попадают не уже загруженные записи, а массив параметров загрузки сравниваемых записей.

Типы из UniverseCompare используются в реализации менеджера методов сравнения CompareRecordMethodsManager. Данный менеджер регистрирует для каждого пространства имён каждого типа сравнения:

  • загрузочные функции;

  • рендеры ячеек;

  • функцию, определяющую может ли в таблице сравнения быть выбран какой-либо dataPath.

В результате, при инициации стор сравнения RecordsCompareStore проходит по всем зарезолвленным UE, создает вложенные сторы сравнения, и загружает данные посредством загрузочных методов, зарегистрированных в CompareRecordMethodsManager.

Пункт главного меню "Процессы"

Были разделены пути для "Процессов" и "Задач".

module-ee/workflow/src/index.ts

  • Для процессов - 'ProcessesPage';

  • Для задач - 'TasksPage';

  • routeFunc и routeAccessor, так же разделены.

Отображение системной информации при сравнении записей

  • RegisterCompareStore.ts, LookupCompareStore.ts - данные получаются при помощи getValueByPath()

  • INamespaceLoadResultMap - изменен тип register: IRecordEntity на:

register: {

dataRecord: IRecordEntity;

recordKeys?: RecordKeys

};
  • InnerCompareCtorData - добавлен флаг showSystemInfo.

  • SystemRow.ts - константы для колонки системной информации.

Отображение "Etalon ID" связанной записи в сравнении связей

RelationCompareStore.ts

  • Был добавлен метод получения EtalonIdTo - public getEtalonIdTo (relation: AbstractRelation): string | undefined.

InnerCompareStore.ts

  • Добавлен новый параметр в ColumnView - getColumnHeader?: (metaColumn:ISearchColumn,columnName:string)=>ReactNode;

AbstractRelationInnerCompareStore.ts

  • Добавлен метод getColumnHeader

Добавлен новый компонент RelationCompareColumnHeader для отображения подсказки.

Уведомление состояния записи

  • Изменился формат сообщения meta-driven, уведомления о вставке и удалении.

Сортировка списка значений перечисления

@universe-platform/model

В класс ModelCollection был добавлен метод sort для сортировки элементов коллекции.

@universe-platform/uikit

В компоненте HeaderCell иконки фильтрации и сортировки отображаются сразу после названия колонки, а не прижимаются к правой границе.

@universe-platform/meta

В компоненте EnumerationEditorForm добавлена возможность сортировки значений выбранного перечисления по id и отображаемому имени.

Доработка отображения cron-выражений на экране операций

@universe-platform/cron

Добавлен компонент ScheduleFieldInput, который отрисовывает уже присутствующий в этом пакете ScheduleInput вместе с названием поля.

@universe-platform/model-form

У компонентов ModelField и ModelForm добавлена возможность менять вид отображаемых полей при помощи свойства fieldRender.

Операция мониторинга расхождений в данных

Добавлена новая операция - "Операция мониторинга расхождения в данных".

Добавлен новый модуль com.universe.mdm.job.data.difference.

Критерий поиска задач/процессов "Доступные мне"

В момент mount компонента WorkflowCard добавляется SearchTerm AvailableForMeST.

Также добавлена проверка на наличие SearchTerm, т.к. критерий "Доступные мне" не нужно добавлять, если поделить с кем-то URL.

Измененная группировка поисковых критериев

DropDownTreeStore.ts

Добавлен новый ключ needDivider?: boolean в тип DropDownTreeNode.

Добавлен новый компонент для рендера кнопки "Избранные" - FavoriteRecordsButton.tsx.

mdm/data/src/page/search/store/search_panel_store/systemTerms.ts - изменен порядок вывода поисковых критериев.

Стилизация системы

Добавлен опциональный флаг ENABLE_EXPERIMENTAL_THEME_PAGE в customer.json (по умолчанию false).

Добавлен опциональный конфигурационный файл theme.json (по умолчанию отсутствует, используется системная тема).

Выбор классификации записи

  • @universe-ee/data-classifier:

  • Изменился вид всплывающиго окна для выбора узлов классификатора в закладке "Классификация" в карточке записи.

  • @universe-platform/confirm:

  • В компонент Confirm было добавлено свойство isFlexBody по аналогии с компонентом Modal.

  • @universe-platform/tree:

  • В VirtualTreeStore добавлена возможность получения детей корневого элемента дерева с помощью getNodeChildren.

  • В компонент VirtualTree добавлено свойство isDisabled, запрещающее выбирать какие-либо ноды.

Виджеты карточки задачи

Модуль @universe-ee/workflow:

  • Добавлена точка расширения UETaskCardDescriptionWidget для отображения в карточке задачи различных виджетов для секции "Описание". Можно задать виджету расположение - колонку (левая или правая) и порядок в колонке. Левая и правая колонка будут отсортированы отдельно.

  • Добавлен компонент WorkflowListsWidget, показывающий результаты заданного количества поисковых выдач по workflow в виде списков ссылок, внешний вид которых адаптирован под показ ссылок на задачи и процессы, которые расположены во вкладках виджета.

Также из карточки задачи удален компонент EmbeddedTasksList. Чтобы вернуть старый виджет на прежнее место необходимо:

  1. Отключить точку расширения subjectWorkflowEntitiesList.

  2. Реализовать точку UETaskCardDescriptionWidget одним из трех вариантов:

    • Использовав WorkflowListsWidget (Рекомендуется. Специализировано для workflow, можно настроить).

    • Использовав SearchLinksList/SearchLinksWidget (То же самое, но абстрактное, не специализировано под workflow. List отображает один список, Widget - набор списков во вкладках).

    • Вернув старый компонент EmbeddedTasksList (Не рекомендуется).

  3. Указать созданной точке расширения meta.column = 1 и meta.order = 0 - таким образом она будет размещена там же, где ранее располагался EmbeddedTasksList.

Отображение связей записи в табличном виде

  • Добавлен новый endpoint POST v2/data/relations/filtered-relations/ и метод getRelationsByRecordEtalonIdAndBoundary(GetRelationsRequestRO), получающий отфильтрованные связи на указанной странице с заданными сортировками. Связи сначала ищутся в openSearch, а затем для найденных relation загружается их актуальное состояние из БД.

  • Ответ на запрос GetRelationsResultRO добавлено поле totalCount, необходимое для пагинации.

  • В getRelationsByRecordEtalonIdAndBoundary запроса v2/data/relations/relation-bulk/ добавлены параметры page и count. page - страница в openSearch, count - количество получаемых на странице записей. Теперь обращение к POST v2/data/relations/filtered-relations/ происходит без указания фильтров.

  • getRelationsByRecordEtalonIdAndBoundary запроса v2/data/relations/relation-bulk/ объявлен Deprecated.

  • В CommonRelationsComponent#loadTimelinesExt внесены изменения, позволяющие при наличии указания конкретных etalonKeys связей подгружать их также из черновиков.

  • Класс GetRelationsBulkRequest переименован в GetRelationsData и сделан внутренним статическим классом класса DataRelationsRestService.

  • Создан REST обогащения черновика CheckStateRestService#applyEnrichment. В данном методе вызывается EnrichmentService#applyEnrichment. Внутри него через ренедеринг создается множество контекстов вставки текущего состояния указанной записи. Каждый контекст вставки записи соответствует периоду актуальности записи. В первый контекст вставки записи добавляются фрагменты вставки связей и классификаторов, затем осуществляется batchUpsert.

  • В пайплайн вставки записи добавлен шаг DQ: если фаза вставки записи "DRAFT", то осуществляется DQ, а затем вставляется обогащенное состояние записи.

  • Поднят флаг trackEnrichments при включенном обогащении.

  • Поля DataQualitySpot, отвечающие за идентификацию атрибута на FE, вынесены в абстрактный класс AbstractNamedSpot.

  • DataQualityEnrichment наследуется от AbstractNamedSpot для подсветки обогащенных полей на FE.

  • Переработан CheckStateBlockConverter для конвертации enrichments атрибутов.

  • ClassificationUpsertTimelineExecutor, если существует не пустой nextTimeline, используется его в качестве modificationBox.

Классификация записей промежуточными узлами версии классификатора

Добавлена возможность устанавливать флаг для назначения классификатора на реестр/справочник, который запрещает создавать классификации записей промежуточными узлами версии классификатора.

Backend:

Ранее параметр leafOnly был в параметрах назначения классификатора, в том числе в запросе /v1/classifiers/model/classifier. При этом GET /v1/classifiers/model/classifier всегда возвращал false в поле leafOnly. В текущем релизе это исправлено.

Теперь у назначений полностью поддерживается параметр leafOnly, который показывает, можно ли создавать классификации по неконечным узлам. При попытке создать классификацию по неконечному узлу при условии, что leafOnly = true для назначения на эту сущность, возникает ошибка валидации.

Frontend:

  • platfom/uikit:

    • EditableCell.tsx - добавлена поддержка Checkbox;

    • CheckboxInput.tsx - соответсвенно, checkbox;

    • cell.tsx - изменены условия для рендера value и editableCell. Поскольку у чекбокса нет value, которое можно было отрендерить, нужно рендерить сам компонент. Поэтому добавлена проверка на editComponentType === EditComponentType.checkbox.

  • ClassifierClassificationDataStore.ts:

    • Добавлен новый метод isLeafOnly;

    • Новая переменная classificationNodeError: ObservableSet<ClassifierNode>, которая хранит добавленные ошибочные узлы классификации на карточку записи;

    • setClassificationNodeError - метод для расчета classificationNodeError.

Движок JSON-правил

  • @universe-platform/parameters: в компонент ParameterItem добавлена поддержка скрытия параметра через дескриптор;

  • @universe/json-rules:

    • Добавлены классы JsonRuleFormStore, JsonRuleFormEventHandler, JsonRuleFormValueParser, позволяющие использовать функциональность JSON-правил;

    • Добавлена обертка над библиотечным правилом UdRule, позволяющая указывать событие, которое будет эмититься, если правило завершится с ошибкой;

  • @unidata-mdm/matching: в MatchingAlgorithmParameterList логика взаимодействия инпутов формы переписана на JSON-правила;

  • @universe-ee/data: в ImportWizardButtonStore и ExportExcelRecordsStore логика взаимодействия инпутов формы переписана на JSON-правила.

Обновление/удаление назначений правил качества

В UpsertQualityModelContext были добавлены новые поля для обновления/удаления назначений по связке namespace + typeName:

  • typeAssignmentsUpdates - обновление назначений по namespace + typeName,

  • typeAssignmentsMerges - объединение назначений по namespace + typeName,

  • typeAssignmentsDeletes - удаление назначений по namespace + typeName.

Существующий функционал объединения назначений правил качества (DataQualityModelComponent#merge) был дополнен с учетом новых полей.

Настройка контейнеров хранилищ

  • Добавлены новые таблицы;

  • Добавлена новая модель;

  • Добавлены два новых модуля com.universe.mdm.los.s3 и com.universe.mdm.job.los.migrate;

  • Добавлена джоба миграции больших объектов;

  • В API больших объектов добавлен новый параметр - имя контейнера конфигурации;

  • В API добавлен новый блок обслуживания модели хранения больших объектов.