В данном примере мы подключим компонент Slider из библиотеки jQuery UI. Слайдер будет иметь два ползунка, определяющих диапазон значений.
Создайте новый проект в CUBA Studio и назовите его jscomponent
.
Далее нажмите на кнопку New UI component. Откроется окно создания визуального компонента UI component generation. В секции Component type выберите значение JavaScript component
.
В поле Vaadin component class name диалога генерации компонента введите значение SliderServerComponent
.
Уберите флажок Integrate into Generic UI. Процесс интеграции компонента в универсальный интерфейс аналогичен описанному в разделе [vaadin_addon_sample_gui], поэтому рассматривать его здесь мы не будем.
После нажатия кнопки OK Studio сгенерирует файлы:
-
SliderServerComponent
- интегрированный с JavaScript компонент Vaadin. -
SliderState
- класс состояния компонента Vaadin. -
slider-connector.js
- JavaScript коннектор для компонента Vaadin
Последовательно пройдемся по сгенерированным заготовкам файлов и внесем в них необходимые изменения.
-
Класс состояния
SliderState
определяет, какие данные будут пересылаться между сервером и клиентом. В нашем случае мы будем пересылать информацию о минимальном и максимальном возможном значении и выбранных значениях слайдера.link:../../../../../source/ui_component/js/SliderState.java[role=include]
-
Серверный компонент Vaadin
SliderServerComponent
.link:../../../../../source/ui_component/js/SliderServerComponent.java[role=include]
Серверный компонент Vaadin определяет набор геттеров и сеттеров для работы с состоянием слайдера, а также интерфейс слушателя изменения значений. Класс компонента должен быть унаследован от
AbstractJavaScriptComponent
.Метод
addFunction()
в конструкторе класса объявляет обработчик RPC-вызова функцииvalueChanged()
с клиента.Аннотации
@JavaScript
и@StyleSheet
указывают на файлы, которые должны быть загружены на веб-страницу. В нашем примере это JavaScript файлы библиотеки jQuery UI и коннектора, а также файл со стилями для jQuery UI. Расположим их в одном Java-пакете с серверным компонентом.
Скачайте архив jQuery UI с сайта http://jqueryui.com/download и поместите файлы jquery-ui.js
и jquery-ui.css
в пакет с классом SliderServerComponent
. На странице скачивания jQuery UI у вас будет возможность выбрать компоненты, которые будут помещены в архив. Для нашего примера достаточно выделить пункт Slider
группы Widgets
.
-
JavaScript коннектор
slider-connector.js
.link:../../../../../source/ui_component/js/slider-connector.js[role=include]
Коннектор представляет собой функцию, которая при загрузке веб-страницы проинициализирует JavaScript компонент. Имя функции должно соответствовать полному имени класса серверного компонента, где точки в имени пакета заменены на символ подчеркивания.
Vaadin добавляет ряд полезных методов в функцию коннектора. Например,
this.getElement()
возвращает HTML DOM элемент компонента,this.getState()
возвращает объект-состояние.В нашем примере коннектор делает следующее:
-
Инициализирует компонент
slider
из библиотеки jQuery UI. При изменении положения одного из ползунков будет вызвана функцияslide()
. Мы видим, что она в свою очередь вызывает методvalueChanged()
коннектора.valueChanged()
- это метод, который мы объявили на стороне сервера в классеSliderServerComponent
. -
Объявляет функцию
onStateChange()
. Она будет вызываться при изменении объекта-состояния на стороне сервера.
-
Для демонстрации работы компонента создадим сущность Product
с тремя атрибутами:
-
name
типа String -
minDiscount
типа Double -
maxDiscount
типа Double
Затем сгенерируем стандартные экраны для данной сущности. Обратите внимание, что мы используем не универсальный компонент платформы, а "нативный" компонент Vaadin. Следовательно, экраны должны располагаться в модуле Web, а не в GUI - укажите это в окне генерации стандартных экранов.
В редакторе сущности мы хотим устанавливать минимальное и максимальное значение скидки с помощью компонента slider
, который мы только что создали.
Перейдите к файлу product-edit.xml
. Поля minDiscount
и maxDiscount
сделайте нередактируемыми, добавив к соответствующим элементам атрибут editable="false"
. Затем добавьте в fieldGroup
новое кастомное поле slider
.
В результате XML-дескриптор экрана редактирования должен выглядеть следующим образом:
link:../../../../../source/ui_component/js/product-edit.xml[role=include]
Перейдите к файлу ProductEdit.java
. Замените его содержимое следующим кодом:
link:../../../../../source/ui_component/js/ProductEdit.java[role=include]
В методе initNewItem()
мы проставляем начальные значения скидок для нового продукта.
В методе init()
инициализируем кастомное поле для слайдера. Для компонента слайдера мы проставляем текущие значения, максимальное и минимальное значения, а также объявляем слушатель изменений значений. При движении ползунка мы будем проставлять новые значения скидок в соответствующие поля редактируемой сущности.
Запустите проект и откройте экран редактирования продукта. Изменение положения ползунка на слайдере должно изменять значение в соответствующем текстовом поле.