Миграция с 7.22 на 7.23
Изменения в сборке
- Добавлена поддержка Java 17
- Версия Spring Boot повышена до 2.5.12
Изменения в XML API
-
Упразднены устаревшие схемы:
page-2.0,region-1.0 -
Добавлены новые схемы:
application-3.0иquery-5.0. -
Атрибуты
ref-pageполей иtarget-pageдействия<copy>упразднены с сохранением обратной совместимости. Атрибутtarget-page-idдействийshow-modal/open-drawerбыл удален. Для обращения к источнику данных родительской страницы рекомендуется использовать<parent-datasource>. -
Атрибуты
visibility-conditionиenabling-conditionупразднены. -
Упразднено действие
<perform>. Вместо него необходимо использовать действие<action>. -
Свойство
default-values-query-idу виджетов вpage-3.0больше не поддерживается, если необходим такой функционал, следует использоватьdefault-values-mode="merge"уdatasourceвpage-4.0.
Переход на application-3.0
- Необходимо перенести элемент
<sidebar>во внутрь элемента<sidebars>. Таким образом добавлена поддержка нескольких<sidebar>, отображающихся в зависимости от url страницы, который должен соответствовать атрибутуpath.
Пример как работало в схемах application-1.0 и application-2.0
<?xml version='1.0' encoding='UTF-8'?>
<application xmlns="http://n2oapp.net/framework/config/schema/application-1.0">
<sidebar src="test" class="test"
title="Test Sidebar" home-page-url="http://google.com/">
<nav ref-id="testMenu"/>
</sidebar>
</application>
Пример как работает в схеме application-3.0
<?xml version='1.0' encoding='UTF-8'?>
<application xmlns="http://n2oapp.net/framework/config/schema/application-3.0">
<sidebars>
<sidebar path="/home"
src="home" class="home"
title="Home Sidebar" home-page-url="http://google.com/">
<nav ref-id="homeMenu"/>
</sidebar>
<sidebar path="/profile"
src="profile" class="profile"
title="Profile Sidebar">
<nav ref-id="profileMenu"/>
</sidebar>
</sidebars>
</application>
Переход на query-5.0
- Все фильтры полей необходимо вынести в новый тэг
<filters>, указав при этом в атрибутеfield-idфильтра значение идентификатора поля, соответствующего данному фильтру.
Пример как работало в схеме query-4.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-4.0">
<fields>
<field id="id">
<select/>
<filters>
<eq filter-id="id"/>
</filters>
</field>
<field id="name">
<select/>
<filters>
<eq filter-id="nameEq"/>
<like filter-id="nameLike"/>
</filters>
</field>
</fields>
</query>
Пример как работает в схеме query-5.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-5.0">
<!-- фильтры вынесены отдельно от полей -->
<!-- для привязки к полю укажите field-id -->
<filters>
<eq field-id="id" filter-id="id"/>
<eq field-id="name" filter-id="nameEq"/>
<like field-id="name" filter-id="nameLike"/>
</filters>
<fields>
<field id="id"/>
<field id="name"/>
</fields>
</query>
- Атрибуты
mapping,default-valueиnormalizeэлемента<select>необходимо перенести в<field>. Тело элемента<select>переносится в атрибутselect-expression.
В новой схеме все поля по умолчанию участвуют в выборке.
Поэтому во всех элементах <field> с отсутствующим тегом <select> необходимо прописать select="false".
После указанных преобразований элемент <select> должен быть удален из поля.
Пример как работало в схеме query-4.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-4.0">
<fields>
<field id="personName">
<select mapping="['name']" default-value="unknown" normalize="#this.toUpperCase()">name: $$name</select>
</field>
<!-- поле не участвует в выборке -->
<field id="personAge"/>
</fields>
</query>
Пример как работает в схеме query-5.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-5.0">
<fields>
<field id="personName" mapping="['name']" select-expression="name: $$name"
default-value="unknown" normalize="#this.toUpperCase()"/>
<!-- поле не участвует в выборке (задан select="false") -->
<field id="personAge" select="false"/>
</fields>
</query>
- Значение атрибута
mappingэлемента<sorting>переносится в атрибутsorting-mappingтега<field>. Тело элемента<sorting>переносится в атрибутsorting-expression.
В новой схеме все поля по умолчанию не являются сортируемыми (как и раньше).
Поэтому во всех элементах <field> с указанным тегом <sorting> необходимо прописать sorting="true".
После указанных преобразований элемент <sorting> должен быть удален из поля.
Пример как работало в схеме query-4.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-4.0">
<fields>
<field id="name">
<sorting/>
</field>
<field id="price" domain="integer">
<sorting mapping="['price']">$$price: price</sorting>
</field>
</fields>
</query>
Пример как работает в схеме query-5.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-5.0">
<fields>
<field id="name" sorting="true"/>
<field id="price" domain="integer" sorting="true" sorting-mapping="['price']" sorting-expression="$$price: price"/>
</fields>
</query>
- Также в новой схеме введена возможность задавать иерархию полей с помощью элементов
<field>,<reference>,<list>. Группы полей, использующих точку вmappingэлемента<select>(или по умолчанию в идентификаторе), напримерmapping="['employee.name']"иmapping="['employee.age']"илиid="cars.id"иid="cars.price"можно задавать как<reference>и<list>поля.
Пример как работало в схеме query-4.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-4.0">
<fields>
<field id="readerId">
<select mapping="['reader.id']"/>
</field>
<field id="readerEmail">
<select mapping="['reader.email']"/>
</field>
<field id="booksTitle">
<select mapping="['reader.books.title']"/>
</field>
<field id="booksAuthor">
<select mapping="['reader.books.author']"/>
</field>
</fields>
</query>
Пример как работает в схеме query-5.0
<?xml version='1.0' encoding='UTF-8'?>
<query xmlns="http://n2oapp.net/framework/config/schema/query-5.0">
<fields>
<reference id="reader" mapping="['reader']">
<field id="readerId" mapping="['id']"/>
<field id="readerEmail" mapping="['email']"/>
<list id="books" mapping="['books']">
<field id="booksTitle" mapping="['title']"/>
<field id="booksAuthor" mapping="['author']"/>
</list>
</reference>
</fields>
</query>
- В
query-5.0упразднены дочерние элементы<expression>и<join>тега<fields>.
Изменения в сборке Frontend
Удалены мо дули
- n2o-auth - содержимое перенесено в n2o-framework/core/auth/
- n2o-notifications - содержимое перенесено в n2o-framework/sagas/notifications/
- n2o-ecp-plugin
Изменения в Java API
- Метод
setCriteriaResolverклассаN2oQueryProcessorбыл переименован вsetCriteriaConstructor. - Изменилась сигнатура метода
buildSuccessMessage классаклассаAlertMessageBuilder:buildSuccessMessage(String, RequestInfo, DataSet)->buildSuccessMessage(ActionRequestInfo<DataSet>, DataSet) - Классы из пакета
net.n2oapp.framework.api.metadata.event.action.*перемещены в пакетnet.n2oapp.framework.api.metadata.action.*. - Класс
net.n2oapp.framework.api.metadata.application.Eventперемещен в пакетnet.n2oapp.framework.api.metadata.meta.event.Event
Изменения в API автотестов
- Интерфейс
Dropdownпереименован вExpandable - Метод
tooltipбыл перемещен из интерфейсаPageв интерфейсы, использующих его компонентов (StandardButton,IconCell,TooltipListCell) - Методы
expand\collapseкомпонентовDateInput,DateInterval,Select,InputSelect,TimePicker,InputSelectTreeобъявлены deprecated. Вместо них рекомендуется использовать методыopenPopup\closePopup - В автотестах теперь необязательно указывать application.xml файл, если он не используется явно.
Как следствие этого, файл
net/n2oapp/framework/autotest/blank.applicationбыл удален. Если он использовался в ваших автотестах, то необходимо удалить его из тестовых классов. - Обращение к алертам через
page.alerts().alert(0)объявлено deprecated. Рекомендуется использовать следующий вызовpage.alerts(Alert.Placement.top).alert(0). - Методы
clickLink\firstTitleShouldHaveText\titleShouldHaveText\titleByIndexShouldHaveTextкомпонента Breadcrumb объявлены deprecated. Для обращения к хлебным крошкам рекомендуется использовать следующий вызовpage.breadcrumb.crumb(0).