В CUBA можно обарачивать JavaScript библиотеку в компонент пользовательского интерфейса, для этого можно использовать JavaScriptComponent или попытаться полностью обернуть JS библиотеку компонентом на Java (см. Подключение JavaScript библиотеки)
В данном случае можно воспользоваться JavaScriptComponent
, чтобы посмотреть как работает библиотека.
Я скачал исходники последней версии OrgChart и сделал пример, который написал автор в codepen.io.
Следуя примеру в документации необходимо определить зависимости для компонента. Для этого положим JS и CSS зависимости в папку web/web/VAADIN
:
orgchart-connector.js
в основном повторяет код описанный в документации и отличается только созданием самого org chart.
orgchart-connector.js
com_company_demorg_web_screens_Test = function() {
var connector = this;
var element = connector.getElement();
element.innerHTML = '<div id="chart-container"></div>'
var dataSource;
connector.onStateChange = function() {
var state = connector.getState();
var data = state.data;
if (data.content) {
var content = JSON.parse(data.content);
createOrgChart(content);
}
}
function createOrgChart(content) {
var oc = $('#chart-container').orgchart({
'data' : content,
'nodeContent': 'title'
});
}
}
В дескриптор экрана добавляем jsComponent
:
<layout>
<jsComponent id="orgChart"
initFunctionName="com_company_demorg_web_screens_Test"
height="400px"
width="400px">
<dependencies>
<dependency path="webjar://jquery:jquery.min.js"/>
<dependency path="vaadin://orgchart-connector.js"/>
<dependency path="vaadin://jquery.orgchart.min.js"/>
<dependency path="vaadin://jquery.orgchart.min.css"/>
</dependencies>
</jsComponent>
</layout>
OrgChart требует для работы jQuery
, который поставляется CUBA в виде web jar. Далее в контроллере экрана мы создаём объект состояния для нашего компонента и заполняем его данными, которые придут в onStateChange
функции orgchart-connector.js
.
Контроллер экрана
@Inject
private JavaScriptComponent orgChart;
@Subscribe
public void onInit(InitEvent event) {
OrgChartState state = new OrgChartState();
state.content = "{\n" +
" \"name\": \"Lao Lao\",\n" +
" \"title\": \"general manager\",\n" +
" \"children\": [\n" +
" { \"name\": \"Bo Miao\", \"title\": \"department manager\" },\n" +
" { \"name\": \"Su Miao\", \"title\": \"department manager\",\n" +
" \"children\": [\n" +
" { \"name\": \"Tie Hua\", \"title\": \"senior engineer\" },\n" +
" { \"name\": \"Hei Hei\", \"title\": \"senior engineer\",\n" +
" \"children\": [\n" +
" { \"name\": \"Pang Pang\", \"title\": \"engineer\" },\n" +
" { \"name\": \"Xiang Xiang\", \"title\": \"UE engineer\" }\n" +
" ]\n" +
" }\n" +
" ]\n" +
" },\n" +
" { \"name\": \"Hong Miao\", \"title\": \"department manager\" },\n" +
" { \"name\": \"Chun Miao\", \"title\": \"department manager\" }\n" +
" ]\n" +
" }";
orgChart.setState(state);
}
class OrgChartState {
public String content;
}
Результат:
Полный пример можно посмотреть здесь: demorg.zip (94.3 КБ)