Добрый день!
Предполагаю, что для интеграции Spotlight.js будет использоваться свой кастомный компонент, поэтому простенький пример будет основан на AbstractJavaScriptComponent
.
Vaadin умеет добавлять ресурсы (иконки, изображения и т.п.) в общее состояние компонента, которое доступно и на клиентской части. Всё что нам нужно это добавить FileStorageResource
в это состояние. Достигается это следующим образом:
DemoGallery.java
@JavaScript({
"vaadin://demogallery/demo-gallery-connector.js"
})
public class DemoGallery extends AbstractJavaScriptComponent {
protected KeyMapper<Resource> resourceKeyMapper = new KeyMapper<>();
public void addFileStorageResource(FileStorageResource resource) {
com.vaadin.server.Resource vResource = null;
// получение ресурса с Ваадиновским типом
if (resource != null && ((WebResource) resource).hasSource()) {
vResource = ((WebResource) resource).getResource();
}
if (vResource != null) {
String key = resourceKeyMapper.key(vResource);
setResource(key, vResource); // установка ресрурса в состояние компонента
}
}
}
Таким образом в коннекторе компонента нам будут доступны корректные URI до переданных ресурсов. Дальше в JavaScript коннекторе мы должны получить реальные URL до ресурсов, которые сможем использовать.
demo-gallery-connector.js
com_company_demoresources_jscomponent_DemoGallery = function () {
var connector = this;
var element = connector.getElement();
element.innerHTML = '<div id="demo-gallery"></div>';
function addImage(uri) {
var img = document.createElement('img');
var url = connector.translateVaadinUri(uri); // функция переводит URI в корректный URL
img.src = url;
img.style.width = "100px";
img.style.height = "100px";
element.append(img);
}
connector.onStateChange = function() {
var state = connector.getState();
if (!state.resources) {
return;
}
// Есть ли ресурсы в коннекторе
if (Object.keys(state.resources).length) {
for (var resource in state.resources) {
addImage(state.resources[resource].uRL);
}
}
}
}
Добавление компонента на экран:
FileRefDescriptorBrowse.java
@Autowired
protected CollectionContainer<FileRefDescriptor> fileRefDescriptorsDc;
@Autowired
protected HBoxLayout demoGalleryBox;
@Subscribe
protected void onAfterShow(final AfterShowEvent event) {
// Создание компонента
DemoGallery demoGallery = new DemoGallery();
demoGallery.setSizeFull();
// Добавление FileRef в компонент
for (FileRefDescriptor item : fileRefDescriptorsDc.getItems()) {
FileStorageResource resource = getApplicationContext().getBean(FileStorageResource.class);
resource.setFileReference(item.getFileRef());
demoGallery.addFileStorageResource(resource);
}
// Добавление компонента в HBoxLayout
demoGalleryBox.unwrap(AbstractOrderedLayout.class).addComponent(demoGallery);
}
Про JavaScriptComponent
можно почитать здесь: Универсальный JavaScriptComponent :: Документация Jmix
Демо проект с примером: demo-resources.zip (96.7 КБ)