Skip to main content

Release notes 7.25

· 4 min read

Вышел релиз N2O Framework 7.25. В этой версии фреймворка появились достаточно полезные изменения в механизмах маппинга и нормализации, а также расширение возможностей меню и открываемых страниц.

Теперь о каждой возможности поподробнее.

Иерархия полей в <out> элементе

В версии 7.23 мы добавили query-5.0, главное преимущество которой задавать иерархию вложенных полей.

<list id="items">
<field id="id"/>
<field id="name"/>
<reference id="info">
...
</reference>
</list>

Но к сожалению object.xml обладал такой функциональностью только в рамках <in> полей. Поэтому в случае сложных возвращаемых объектов было крайне неудобно применять маппинг и нормализацию.

И теперь наконец эта оплошность была устранена. Выходные поля, определенные в <out>, могут быть разложены и обработаны по отдельности согласно их структуре.

<out>
<field id="id"/>
<reference id="info">
...
</reference>
<list id="documents">
...
</list>
</out>

Ключевое слово #parent в нормализации

С появлением иерархии в полях ключевое слово #data перестало покрывать все случаи. Напомню, что эта замечательная конструкция позволяла ссылаться на значения других полей в нормализации.

<fields>
<field id="beginDate"/>
<field id="endDate"/>
<field id="period" normalize="#data['beginDate'] + ' - ' + #data['endDate']"/>
</fields>

Единственный ее минус в том, что ссылаться можно лишь на поля на том же уровне вложенности.

Чтобы перед пользователем не стояло такого ограничения было введено ключевое слово #parent. Как видите синтаксис очень похож на #data, за тем лишь исключением, что обращение будет к полям на уровень выше.

<fields>
<field id="name"/>
<reference id="org">
<field id="fullName" normalize="#parent['name'] + '_' + #this"/>
</reference>
</fields>

Элемент <switch> как аналог нормализации

Механизм нормализации достаточно мощный и позволяет преобразовывать данные любым образом. Но для случая справочников или сопоставления значений такой подход выглядит крайне переусложненным.

Взгляните на этот случай и вы поймете о чем речь.

<field id="color" mapping="['status']"
normalize="#this == 'New' ? 'success' : #this == 'In Progress' ? 'warning' : #this == 'Blocked'? 'danger' : 'info'"/>

Появившийся элемент <switch> предлагает следующую альтернативу:

<field id="color" mapping="['status']">
<switch>
<case value="New">success</case>
<case value="In Progress">warning</case>
<case value="Blocked">danger</case>
<default>info</default>
</switch>
</field>

Причем его можно использовать как вместо normalize, так и совместно с ним. А чтобы окончательно не запутаться какая из операций за какой следует, появился специальный раздел в документации, где описан порядок следования операций над полем.

Полноценная поддержка действий в menu-item приложения

Действия в menu-item всегда выполняли лишь функцию открытия страницы. Это действительно наиболее частый случай использования. Но мы решили не останавливаться на этом и добавить поддержку любого из доступных в n2o действий.

Посмотрите как это может выглядеть.

Причем нет никаких ограничений ни с точки зрения мульти действий, ни по работе с источником данных. Стоит лишь помнить, что работа происходит с источником, заданными в application.xml

  • Помимо этого, можно вообще не указывать никакое действие внутри элемента <menu-item>. В таком случае пункт меню станет некликабельным.

Прокидываемые тулбары и действия

Мы не раз сталкивались с проблемами создания универсальной страницы на создание и изменение. Возможность прокидывания на открываемую страницу "хлебных крошек" и источников данных решило часть проблем. Но управлять кнопками страницы не было никакой возможности.

В дополнении к этому нас всегда смущало множество порожденных атрибутов вида -after-submit, copy-, target-. Такое количество "синтаксического сахара" не могло не сказываться на сложности понимания работы компонента. Поэтому логичным решением стала возможность прокидывать кнопки и действия в открываемую страницу.

Вот так выглядел элемент show-modal раньше:

<show-modal page-id="personCard"
submit-operation-id="update"
submit-label="Сохранить"
close-after-submit="true"
refresh-after-submit="true"/>

А вот аналогичная запись с новым api:

<show-modal page-id="personCard">
<toolbars>
<toolbar>
<button label="Сохранить">
<invoke operation-id="update"/>
<refresh datasource="parentDs"/>
<close/>
</button>
</toolbar>
</toolbars>
</show-modal>

Новый механизм стал более многословен, но при этом более гибок и прозрачен.

Однако, если вам не хочется отказываться от старого подхода, то не стоит беспокоиться. Его обратная совместимость соблюдена и ваш код будет работать и в новой версии.

Что еще?

  • Был улучшен механизм валидаций xml файлов. Теперь осуществляется гораздо больше проверок на корректность составления пользователем xml.
  • Виджет "Таблица" подвергся полной переработке, при этом не поменяв api. Это положительно скажется, как на дальнейшем расширении этого компонента, так и на простоту кастомизации.

Полезные ссылки