Release notes 7.25
Вышел релиз 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. Это положительно скажется, как на дальнейшем расширении этого компонента, так и на простоту кастомизации.