Slide 1

Slide 1 text

CUBA Platform 7.0

Slide 2

Slide 2 text

2 Мотивация изменений ⊷ Улучшение эргономики инструментов ⊷ Повышение гибкости фреймворка ⊷ Появление API ⊷ Упрощение подходов ⊷ Фундамент для развития экосистемы ⊷ С сохранением обратной совместимости

Slide 3

Slide 3 text

План 1. CUBA Studio 2. OSS Add-ons 3. Screen API 4. Event Handling 5. Functional Interfaces 6. Actions 7. Typed UI Components 8. URL Routing 9. Data Components 10. Compatibility Layer 11. New UI Components 12. Разное 3

Slide 4

Slide 4 text

CUBA Studio 7 4

Slide 5

Slide 5 text

Основные проблемы ⊷ Studio 6.x - отдельное приложение ⊷ Невозможность работы с кодом ⊷ Собственный парсер Java / Groovy ⊶ Сложно поддержать языки отличные от Java (Kotlin) ⊶ Ограниченный hot deploy 5

Slide 6

Slide 6 text

Варианты ⊷ IntelliJ IDEA Plugin ⊷ Standalone IDE Функциональность - одинаковая! https://cuba-platform.com/download Новый плагин CUBA заменяет старый, но включает всю его функциональность 6

Slide 7

Slide 7 text

7 Visual Designers

Slide 8

Slide 8 text

8 Intentions / Inspections / Navigation / Autocomplete

Slide 9

Slide 9 text

9 Debug Configuration

Slide 10

Slide 10 text

CUBA CLI 10 https://github.com/cuba-platform/cuba-cli

Slide 11

Slide 11 text

OSS Add-ons 11

Slide 12

Slide 12 text

Open Source Add-ons ⊷ Charts, Reports, FTS, BPM, BI ⊷ Apache License 2.0 ⊷ Только для версий 7.0+ ⊷ GitHub repository & issues Принимаем Pull Requests! 12

Slide 13

Slide 13 text

Java 8 / 11 Vaadin 8 Spring 5 13 Technologies

Slide 14

Slide 14 text

Screen API 14

Slide 15

Slide 15 text

⊷ Непрозрачность - многое скрыто в недрах предков экранов ⊷ Отсутствие API - жёсткая типовая функциональность ⊷ Реактивное развитие - фичи появляются стихийно в ответ на внешние раздражители Основные проблемы 15

Slide 16

Slide 16 text

Контроллеры экранов ⊷ Screen ⊷ ScreenFragment Аннотации: @UiController @UiDescriptor 16

Slide 17

Slide 17 text

Screen Life Cycle События: ⊷ Init ⊷ AfterInit ⊷ BeforeShow ⊷ AfterShow ⊷ BeforeClose ⊷ AfterClose 17

Slide 18

Slide 18 text

Базовые экраны ⊷ Screen ⊷ StandardEditor implements EditorScreen ⊷ StandardLookup implements LookupScreen ⊷ MasterDetailScreen 18

Slide 19

Slide 19 text

Прикладные интерфейсы ⊷ Notifications - нотификации ⊷ Dialogs - стандартные диалоги ⊷ Screens / ScreenBuilders - открытие окон ⊷ MessageBundle - пакет сообщений экрана 19

Slide 20

Slide 20 text

Event Handling Единообразный декларативный способ подписки на любые события - @Subscribe 20

Slide 21

Slide 21 text

Functional Interfaces Декларативный способ объявления функциональных обработчиков - @Install 21

Slide 22

Slide 22 text

Actions Идеология: ⊷ Action позволяет вызвать функциональность, ⊷ Служит мостиком между бинами и UI компонентами, ⊷ Не содержит полезного кода, только делегирует исполнение. Нововведения: ⊷ @ActionType ⊷ Делегация вместо наследования классов действий 22

Slide 23

Slide 23 text

Typed UI Components ⊷ Все поля ввода - параметризованы типом значения. ⊷ ValueChangeEvent 23

Slide 24

Slide 24 text

URL Routing 24

Slide 25

Slide 25 text

URL Routing - CRUD ⊷ @Route ⊷ StandardEditor поддерживает открытие по ID http://host:port/app/#main/42/orders/edit?id=17 25

Slide 26

Slide 26 text

URL Routing - Custom ⊷ UrlRouting - API для управления состоянием ⊷ UrlParamsChangedEvent - событие изменения URL в браузере 26

Slide 27

Slide 27 text

Data Components 27

Slide 28

Slide 28 text

⊷ Datasource - монолитный, громоздкий и плохо- адаптируемый механизм ⊷ Ненадежное отслеживание изменений - сохраняется только то, что лежит в datasource Основные проблемы 28

Slide 29

Slide 29 text

29 Data Components Container Хранит и предоставляет данные UI компонентам. Loader Декларативный механизм загрузки данных для контейнеров. Data Context Отслеживает и сохраняет изменения в графах сущностей. DataComponents фабрика компонентов данных.

Slide 30

Slide 30 text

Контейнеры ⊷ InstanceContainer ⊶ setItem() / getItem() ⊷ CollectionContainer extends InstanceContainer ⊶ setItems() / getItems() / getMutableItems() ⊶ replaceItem() / getItemIndex(entityId) / getItem(entityId) / setSorter() ⊷ CollectionPropertyContainer extends CollectionContainer ⊶ setDisconnectedItems() / getDisconnectedItems() 30

Slide 31

Slide 31 text

Контейнеры (новые возможности) ⊷ Фильтрация строк в CollectionPropertyContainer 31

Slide 32

Slide 32 text

Контейнеры (новые возможности) ⊷ Привязка UI-компонентов к вложенным атрибутам 32

Slide 33

Slide 33 text

Загрузка данных ⊷ @LoadDataBeforeShow ⊷ getScreenData().loadAll() ⊷ customersDl.load() 33

Slide 34

Slide 34 text

Запросы с параметрами ⊷ Обработка событий вместо декларативной связи контейнеров 34

Slide 35

Slide 35 text

Запросы с параметрами ⊷ Query conditions для декларативного формирования запроса в зависимости от наличия параметров 35

Slide 36

Slide 36 text

Отслеживание изменений DataContext: ⊷ merge(Entity) ⊷ remove(Entity) ⊷ commit() 36

Slide 37

Slide 37 text

Композиции 37

Slide 38

Slide 38 text

Обработка событий и делегация Делегация вместо создания классов и наследования. ⊷ @Install(target = Target.DATA_LOADER) ⊷ @Install(target = Target.DATA_CONTEXT) 38

Slide 39

Slide 39 text

⊷ EntityChangedEvent ⊶ Содержит id измененной сущности ⊶ Содержит старые значения локальных атрибутов и старые id ссылок ⊶ Может быть обработан внутри транзакции или после коммита ⊶ Требует наличия аннотации @PublishEntityChangedEvents ⊷ TransactionalDataManager ⊶ Выполняет действия в контексте активной транзакции или стартует новую ⊶ Принимает и возвращает detached сущности, явно сохраняет в БД ⊶ Применяет security и все остальное ⊷ Работают JPA lifecycle callbacks ⊶ @PrePersist, @PreUpdate, etc. Изменения в API среднего слоя 39

Slide 40

Slide 40 text

Compatibility Layer 40

Slide 41

Slide 41 text

Совместимость экранов UI Реализован слой совместимости: ⊷ AbstractWindow extends Screen ⊷ WebScreens implements WindowManager Источники данных: ⊷ Screen - data components ⊷ AbstractWindow / AbstractFrame - datasources 41

Slide 42

Slide 42 text

Совместимость UI компонентов Биндинг данных для UI компонентов выполяется при помощи адаптеров, e.g. DatasourceTableItems. ⊷ Table.setDatasource -> setItems(Items) ⊷ Field.setDatasource -> setValueSource(ValueSource) ⊷ OptionsField.setOptionsDatasource -> setOptions(Options) 42

Slide 43

Slide 43 text

New UI Components 43

Slide 44

Slide 44 text

⊷ Использование FieldGroup не type safe ⊷ Магия усложняет жизнь инструментам ⊷ Сложная интеграция JavaScript компонентов Основные проблемы 44

Slide 45

Slide 45 text

Form ⊷ Контейнер для UI компонентов ⊷ Легковесная замена FieldGroup ⊷ Все компоненты определяются в design-time 45

Slide 46

Slide 46 text

TreeDataGrid ⊷ Замена TreeTable ⊷ Древовидный вариант DataGrid ⊷ Поддерживает inline редактирование 46

Slide 47

Slide 47 text

JavaScriptComponent Простейший способ интеграции JavaScript виджетов без создания UI компонентов на Vaadin. Минимальный вариант использования: ⊷ POJO состояния ⊷ JavaScript файл 47

Slide 48

Slide 48 text

Inline HTML / CSS attributes HtmlAttributes ⊷ CSS атрибуты (XML, API) ⊷ DOM атрибуты (API) Применение: ⊷ Простейшие манипуляции CSS ⊷ Компоновка при помощи CSS Flex / Grid в CssLayout Ограничение: только для верхнего DOM элемента в UI компоненте 48

Slide 49

Slide 49 text

Разное Min/Max Size Layout и ScrollBoxLayout поддерживают min/max для width/height размеров. Screen Mixins Новый механизм выделения сквозной функциональности UI экранов в интерфейсы- примеси. Context Help Все UI компоненты поддерживают иконку контекстной справки с подсказкой. 49 ValueChange Source В события изменения значения в UI компонентах добавлен признак userOriginated. Button ClickEvent Для кнопок доступно событие ClickEvent. Назначать Action больше не требуется. BCrypt Hash Для новых проектов используется алгоритм хэширования паролей BCrypt.

Slide 50

Slide 50 text

Спасибо! Вопроcы?