Release notes 7.28
Рады представить закрывающий в этом году релиз 7.28, который является важным шагом на пути по улучшению пользовательского опыта. В этом релизе мы реализовали частичное обновление страниц и кэширующий источник данных, расширили функционал таблицы и контроль выполняемых цепочек действий, добавили много исправлений и оптимизаций.
Обновление части страницы
Долгое время для решения задачи реализации сложных форм из нескольких экранов в n2o-framework существовало только два пути:
- загрузка всех экранов формы разом и переключение между ними через условия видимости
- разбиение на несколько страниц с дублированием повторяющихся элементов (навигация, общие источники данных и т.д) на каждой из них
Оба эти варианта были сложными в поддержке. К тому же первый сильно сказывался на клиентской производительности, а второй перезагружал всю страницу целиком, что приводило к морганиям интерфейса.
В текущей версии мы разработали механизм динамической загрузки "подстраниц", позволяющий вынести каждый шаг формы на отдельную страницу и подгружать их по мере необходимости.
В xml это выглядит как обычная страница, содержащая общую часть и регион <sub-page>
, размещённый в любом удобном месте, с перечислением всех "подстраниц" и путей для них:
<page xmlns="http://n2oapp.net/framework/config/schema/page-4.0">
<regions>
<!-- Общая часть составной формы-->
<form>
<toolbar place="topLeft">
<button label="sub 1">
<a href="./sp_1" target="application"/>
</button>
<button label="sub 2">
<a href="./sp_2" target="application"/>
</button>
</toolbar>
...
</form>
<!-- Переключаемая часть -->
<sub-page>
<page page-id="subpage_1" route="/sp_1"/>
<page page-id="subpage_2" route="/sp_2"/>
</sub-page>
</regions>
</page>
Переход между "подстраницами" осуществляется без перезагрузки основной, динамически подгружая соответствующую текущему url "подстраницу".
Кэширующий датасурс
В версии 7.23 мы внедрили локальные источники данных, позволяющие накапливать пользовательские изменения в браузерных хранилищах и не терять их при перезагрузке страницы.
Однако оставались задачи, когда сначала нужно было единожды получить данные с сервера, а уже потом хранить их в браузере. Для решения этой задачи ранее предполагалось использовать два различных источника данных и связывать их друг с другом зависимостями и дополнительными условиями.
Но теперь для этого есть кэширующий датасурс - объединение обычного источника данных с браузерным хранилищем:
<cached-datasource id="ds1" storage-key="test_key"
invalidate-cache-path-params="person_id"
query-id="person"
cache-expires="1d">
<filters>
<eq field-id="id" param="person_id"/>
</filters>
<submit clear-cache-after-submit="true"/>
</cached-datasource>
При загрузке страницы, <cached-datasource>
проверяет данные в браузерном хранилище и их актуальность, и, при необходимости, обновляет их, отправляя запрос на сервер.
Таким образом, при закрытии вкладки или перезагрузке страницы, данные не будут потеряны, а "тяжелые" запросы на сервер будут выполнены только по необходимости.
Ячейка со списком значений
Функционал ячейки list был расширен, теперь в ней можно отображать не только текст в тегах, а это полноценная обёртка над другими ячейками для вывода вложенного списка в виде текста, ссылок, баджей или кастомных ячеек:
<table>
...
<columns>
<column text-field-id="links" label="Список ссылок">
<list label-field-id="name">
<link url="{link}" target="self"/>
</list>
</column>
<column text-field-id="texts" label="Список текста">
<list/>
</column>
</columns>
</table>
Восстановление параметров пагинации
Текущее состояние параметров пагинации (выбранная страница, размер списка) теперь возможно сохранять в url страницы, что позволяет восстанавливать его при перезагрузках страницы и переходах по ссылкам.
Для этого необходимо указать параметр routable
:
<table>
...
<pagination routable="true"/>
</table>
Действие <on-fail>
Продолжаем развивать функционал мульти-действий и давать больший контроль над выполнением последовательности, позволяя указать действие, выполняемое в случае возникновения ошибки в цепочке действий:
<button label="Сохранить">
<invoke operation-id="create"/>
...
<alert text="Данные сохранены" color="success"/>
<on-fail>
<alert text="Сохранение завершилось ошибкой" color="danger"/>
<close/>
</on-fail>
</button>