@@ -16,12 +16,16 @@ import com.vaadin.ui.themes.ValoTheme
1616import groovy.util.logging.Log4j2
1717import life.qbic.business.offers.Currency
1818import life.qbic.business.offers.identifier.OfferIdFormatter
19+ import life.qbic.portal.offermanager.ExportAllOffers
1920import life.qbic.portal.offermanager.OfferFileNameFormatter
2021import life.qbic.portal.offermanager.components.GridUtils
2122import life.qbic.portal.offermanager.components.offer.overview.projectcreation.CreateProjectView
2223import life.qbic.portal.offermanager.components.project.ProjectIdContainsString
2324import life.qbic.portal.offermanager.dataresources.offers.OfferOverview
2425
26+ import java.time.LocalDate
27+ import java.util.function.Supplier
28+
2529/**
2630 * A basic offer overview user interface.
2731 *
@@ -41,13 +45,13 @@ class OfferOverviewView extends VerticalLayout implements Observer {
4145
4246 final private Grid<OfferOverview > overviewVersionsGrid
4347
44- final private Button downloadBtn
48+ final private Button downloadOfferBtn
4549
4650 final Button updateOfferBtn
4751
4852 final private ProgressBar downloadSpinner
4953
50- private FileDownloader fileDownloader
54+ private FileDownloader offerFileDownloader
5155
5256 private CreateProjectView createProjectView
5357
@@ -59,14 +63,18 @@ class OfferOverviewView extends VerticalLayout implements Observer {
5963
6064 private Button toggleVersions
6165
66+ private final Button exportAllOffersToTsvButton
67+
68+
6269 OfferOverviewView (OfferOverviewModel model ,
6370 OfferOverviewController offerOverviewController ,
64- CreateProjectView createProjectView ) {
71+ CreateProjectView createProjectView ,
72+ ExportAllOffers exportAllOffers ) {
6573 this . model = model
6674 this . offerOverviewController = offerOverviewController
6775 this . overviewGrid = new Grid<> ()
6876 this . overviewVersionsGrid = new Grid<> ()
69- this . downloadBtn = new Button (" Download Offer" , VaadinIcons . DOWNLOAD )
77+ this . downloadOfferBtn = new Button (" Download Offer" , VaadinIcons . DOWNLOAD )
7078 this . updateOfferBtn = new Button (" Update Offer" , VaadinIcons . EDIT )
7179 this . createProjectButton = new Button (" Create Project" , VaadinIcons . PLUS_CIRCLE )
7280 this . toggleOverview = new Button (" Overview" )
@@ -76,6 +84,9 @@ class OfferOverviewView extends VerticalLayout implements Observer {
7684 // Register this view to be notified on updates in the model
7785 this . model. addObserver(this )
7886
87+ this . exportAllOffersToTsvButton = new Button (" Export to TSV" , VaadinIcons . DOWNLOAD )
88+ downloadStreamWhenClickingButton(exportAllOffersToTsvButton, exportAllOffers ::exportOffersToTsv)
89+
7990 initLayout()
8091
8192 configureOverviewGrid()
@@ -90,7 +101,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
90101 this . toggleVersions. setEnabled(false )
91102 this . toggleOverview. setEnabled(false )
92103
93- this . toggleVersions. addClickListener( {
104+ this . toggleVersions. addClickListener({
94105 overviewGrid. setVisible(false )
95106 overviewVersionsGrid. setVisible(true )
96107 toggleVersions. setEnabled(false )
@@ -146,9 +157,12 @@ class OfferOverviewView extends VerticalLayout implements Observer {
146157 right component will be the offer download button.
147158 */
148159 final HorizontalLayout activityContainer = new HorizontalLayout ()
149- downloadBtn. setStyleName(ValoTheme . BUTTON_LARGE )
150- downloadBtn. setEnabled(false )
151- downloadBtn. setDescription(" Download offer" )
160+ exportAllOffersToTsvButton. setStyleName(ValoTheme . BUTTON_LARGE )
161+ exportAllOffersToTsvButton. setEnabled(true )
162+ exportAllOffersToTsvButton. setDescription(" Download Offers as TSV" )
163+ downloadOfferBtn. setStyleName(ValoTheme . BUTTON_LARGE )
164+ downloadOfferBtn. setEnabled(false )
165+ downloadOfferBtn. setDescription(" Download offer" )
152166 updateOfferBtn. setStyleName(ValoTheme . BUTTON_LARGE )
153167 updateOfferBtn. setEnabled(false )
154168 updateOfferBtn. setDescription(" Update offer" )
@@ -166,15 +180,16 @@ class OfferOverviewView extends VerticalLayout implements Observer {
166180
167181 // Add a button to create a project from an offer
168182 activityContainer. addComponents(
169- downloadBtn ,
183+ downloadOfferBtn ,
170184 updateOfferBtn,
171185 createProjectButton,
186+ exportAllOffersToTsvButton,
172187 downloadSpinner)
173188
174189 activityContainer. setMargin(false )
175190 activityContainer. setComponentAlignment(downloadSpinner, Alignment . MIDDLE_CENTER )
176191
177- HorizontalLayout wrapperLayout = new HorizontalLayout (activityContainer,toggleLayout)
192+ HorizontalLayout wrapperLayout = new HorizontalLayout (activityContainer, toggleLayout)
178193
179194 wrapperLayout. setComponentAlignment(toggleLayout, Alignment . MIDDLE_RIGHT )
180195 wrapperLayout. setWidthFull()
@@ -227,7 +242,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
227242 grid. setWidthFull()
228243 }
229244
230- private static void setupFilters (ListDataProvider<OfferOverview > offerOverviewDataProvider , Grid<? extends OfferOverview > grid ) {
245+ private static void setupFilters (ListDataProvider<OfferOverview > offerOverviewDataProvider , Grid<? extends OfferOverview > grid ) {
231246 HeaderRow headerFilterRow = grid. appendHeaderRow()
232247
233248 GridUtils . setupColumnFilter(offerOverviewDataProvider,
@@ -275,9 +290,9 @@ class OfferOverviewView extends VerticalLayout implements Observer {
275290 }
276291
277292 private void setupGridListeners () {
278- overviewGrid. addSelectionListener({ selection -> handleSelection(selection)}
293+ overviewGrid. addSelectionListener({ selection -> handleSelection(selection) }
279294 )
280- overviewVersionsGrid. addSelectionListener({ selection -> handleSelection(selection)}
295+ overviewVersionsGrid. addSelectionListener({ selection -> handleSelection(selection) }
281296 )
282297 }
283298
@@ -290,7 +305,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
290305
291306 private void deselectOfferOverview () {
292307 updateOfferBtn. setEnabled(false )
293- downloadBtn . setEnabled(false )
308+ downloadOfferBtn . setEnabled(false )
294309 createProjectButton. setEnabled(false )
295310 toggleVersions. setEnabled(false )
296311 }
@@ -301,7 +316,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
301316 UI . getCurrent(). setPollInterval(50 )
302317 downloadSpinner. setVisible(true )
303318 new LoadOfferInfoThread (UI . getCurrent(), overview). start()
304- downloadBtn . setEnabled(true )
319+ downloadOfferBtn . setEnabled(true )
305320 updateOfferBtn. setEnabled(true )
306321 toggleVersions. setEnabled(true )
307322 checkProjectCreationAllowed(overview)
@@ -315,21 +330,29 @@ class OfferOverviewView extends VerticalLayout implements Observer {
315330 }
316331 }
317332
318- private void createResourceForDownload () {
319- removeExistingResources ()
333+ private void createResourceForOfferPdfDownload () {
334+ removeExistingResourcesForOfferPdfDownload ()
320335
321336 StreamResource offerResource =
322337 new StreamResource ((StreamResource.StreamSource res) -> {
323338 return model. getOfferAsPdf()
324339 }, OfferFileNameFormatter . getFileNameForOffer(model. getSelectedOffer()))
325- fileDownloader = new FileDownloader (offerResource)
326- fileDownloader. extend(downloadBtn)
340+ offerFileDownloader = new FileDownloader (offerResource)
341+ offerFileDownloader. extend(downloadOfferBtn)
342+ }
343+
344+ private static void downloadStreamWhenClickingButton (AbstractComponent button , Supplier<InputStream > inputStreamSupplier ) {
345+ StreamResource offerTsvResource = new StreamResource ((resource) -> inputStreamSupplier. get(),
346+ LocalDate . now(). toString() + " .offer-export" + " .tsv" )
347+ // avoid browser caching file by name
348+ offerTsvResource. setCacheTime(0 )
349+ new FileDownloader (offerTsvResource). extend(button)
327350 }
328351
329- private void removeExistingResources () {
330- Optional . ofNullable(fileDownloader ). ifPresent({
331- if (downloadBtn . extensions. contains(fileDownloader )) {
332- downloadBtn . removeExtension(fileDownloader )
352+ private void removeExistingResourcesForOfferPdfDownload () {
353+ Optional . ofNullable(offerFileDownloader ). ifPresent({
354+ if (downloadOfferBtn . extensions. contains(offerFileDownloader )) {
355+ downloadOfferBtn . removeExtension(offerFileDownloader )
333356 }
334357 })
335358 }
@@ -362,7 +385,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
362385 selectedOffer = overviewGrid. getSelectionModel(). getFirstSelectedItem()
363386 })
364387 offerOverviewController. fetchOffer(offerOverview. offerId)
365- createResourceForDownload ()
388+ createResourceForOfferPdfDownload ()
366389
367390 ui. access(() -> {
368391 downloadSpinner. setVisible(false )
0 commit comments