I want to upload file for the select row in the datagrid within a listView. Is there any way we can set FileStorageUploadField to be like a “list_itemTracking” so that the fileUpload field is activate only when the user has selected a row in the dataGrid?
Greetings,
As i understand you need DataGrid with ItemDetails and there you can place your fileUploadField. We have ui sample for it:
If you need more specific way to edit, probably we can create column renderer and if current row is selected instead of returning text in column renderer we can return something like fileUploadField
Best regards,
Dmitry
Hi
Not item details but I need to update to ListView
Maybe you need solution like this?
Code:
@Route(value = "new-entities", layout = MainView.class)
@ViewController(id = "NewEntity.list")
@ViewDescriptor(path = "new-entity-list-view.xml")
@LookupComponent("newEntitiesDataGrid")
@DialogMode(width = "64em")
public class NewEntityListView extends StandardListView<NewEntity> {
@Autowired
protected UiComponents uiComponents;
@ViewComponent
private DataGrid<NewEntity> newEntitiesDataGrid;
@Supply(to = "newEntitiesDataGrid.fileField", subject = "renderer")
private Renderer<NewEntity> newEntitiesDataGridFileFieldRenderer() {
return new ComponentRenderer<>(e -> {
NewEntity selected;
if (newEntitiesDataGrid.getSelectedItems().isEmpty()) {
selected = null;
} else {
selected = newEntitiesDataGrid.getSelectedItems().iterator().next();
}
if (e.equals(selected)) {
var fileUploadField = uiComponents.create(FileStorageUploadField.class);
fileUploadField.addFileUploadSucceededListener(event -> e.setFile(fileUploadField.getValue()));
return fileUploadField;
} else {
return new Span(e.getFile() == null ? "" : e.getFile().toString());
}
});
}
// no need
@Subscribe
public void onBeforeShow(final BeforeShowEvent event) {
newEntitiesDataGrid.asSingleSelect().addValueChangeListener(e -> {
NewEntity oldItem = e.getOldValue();
NewEntity newItem = e.getValue();
if (oldItem != null) {
newEntitiesDataGrid.getDataProvider().refreshItem(oldItem);
}
if (newItem != null) {
newEntitiesDataGrid.getDataProvider().refreshItem(newItem);
}
});
}
@Subscribe("newEntitiesDataGrid")
public void onNewEntitiesDataGridSelection(final SelectionEvent<DataGrid<NewEntity>, NewEntity> event) {
// fireing update event to force refresh single item render
event.getFirstSelectedItem().ifPresent(entity -> {
newEntitiesDataGrid.getDataProvider().refreshItem(entity);
});
}
}