@@ -16,12 +16,16 @@ import com.vaadin.ui.themes.ValoTheme
16
16
import groovy.util.logging.Log4j2
17
17
import life.qbic.business.offers.Currency
18
18
import life.qbic.business.offers.identifier.OfferIdFormatter
19
+ import life.qbic.portal.offermanager.ExportAllOffers
19
20
import life.qbic.portal.offermanager.OfferFileNameFormatter
20
21
import life.qbic.portal.offermanager.components.GridUtils
21
22
import life.qbic.portal.offermanager.components.offer.overview.projectcreation.CreateProjectView
22
23
import life.qbic.portal.offermanager.components.project.ProjectIdContainsString
23
24
import life.qbic.portal.offermanager.dataresources.offers.OfferOverview
24
25
26
+ import java.time.LocalDate
27
+ import java.util.function.Supplier
28
+
25
29
/**
26
30
* A basic offer overview user interface.
27
31
*
@@ -41,13 +45,13 @@ class OfferOverviewView extends VerticalLayout implements Observer {
41
45
42
46
final private Grid<OfferOverview > overviewVersionsGrid
43
47
44
- final private Button downloadBtn
48
+ final private Button downloadOfferBtn
45
49
46
50
final Button updateOfferBtn
47
51
48
52
final private ProgressBar downloadSpinner
49
53
50
- private FileDownloader fileDownloader
54
+ private FileDownloader offerFileDownloader
51
55
52
56
private CreateProjectView createProjectView
53
57
@@ -59,14 +63,18 @@ class OfferOverviewView extends VerticalLayout implements Observer {
59
63
60
64
private Button toggleVersions
61
65
66
+ private final Button exportAllOffersToTsvButton
67
+
68
+
62
69
OfferOverviewView (OfferOverviewModel model ,
63
70
OfferOverviewController offerOverviewController ,
64
- CreateProjectView createProjectView ) {
71
+ CreateProjectView createProjectView ,
72
+ ExportAllOffers exportAllOffers ) {
65
73
this . model = model
66
74
this . offerOverviewController = offerOverviewController
67
75
this . overviewGrid = new Grid<> ()
68
76
this . overviewVersionsGrid = new Grid<> ()
69
- this . downloadBtn = new Button (" Download Offer" , VaadinIcons . DOWNLOAD )
77
+ this . downloadOfferBtn = new Button (" Download Offer" , VaadinIcons . DOWNLOAD )
70
78
this . updateOfferBtn = new Button (" Update Offer" , VaadinIcons . EDIT )
71
79
this . createProjectButton = new Button (" Create Project" , VaadinIcons . PLUS_CIRCLE )
72
80
this . toggleOverview = new Button (" Overview" )
@@ -76,6 +84,9 @@ class OfferOverviewView extends VerticalLayout implements Observer {
76
84
// Register this view to be notified on updates in the model
77
85
this . model. addObserver(this )
78
86
87
+ this . exportAllOffersToTsvButton = new Button (" Export to TSV" , VaadinIcons . DOWNLOAD )
88
+ downloadStreamWhenClickingButton(exportAllOffersToTsvButton, exportAllOffers ::exportOffersToTsv)
89
+
79
90
initLayout()
80
91
81
92
configureOverviewGrid()
@@ -90,7 +101,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
90
101
this . toggleVersions. setEnabled(false )
91
102
this . toggleOverview. setEnabled(false )
92
103
93
- this . toggleVersions. addClickListener( {
104
+ this . toggleVersions. addClickListener({
94
105
overviewGrid. setVisible(false )
95
106
overviewVersionsGrid. setVisible(true )
96
107
toggleVersions. setEnabled(false )
@@ -146,9 +157,12 @@ class OfferOverviewView extends VerticalLayout implements Observer {
146
157
right component will be the offer download button.
147
158
*/
148
159
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" )
152
166
updateOfferBtn. setStyleName(ValoTheme . BUTTON_LARGE )
153
167
updateOfferBtn. setEnabled(false )
154
168
updateOfferBtn. setDescription(" Update offer" )
@@ -166,15 +180,16 @@ class OfferOverviewView extends VerticalLayout implements Observer {
166
180
167
181
// Add a button to create a project from an offer
168
182
activityContainer. addComponents(
169
- downloadBtn ,
183
+ downloadOfferBtn ,
170
184
updateOfferBtn,
171
185
createProjectButton,
186
+ exportAllOffersToTsvButton,
172
187
downloadSpinner)
173
188
174
189
activityContainer. setMargin(false )
175
190
activityContainer. setComponentAlignment(downloadSpinner, Alignment . MIDDLE_CENTER )
176
191
177
- HorizontalLayout wrapperLayout = new HorizontalLayout (activityContainer,toggleLayout)
192
+ HorizontalLayout wrapperLayout = new HorizontalLayout (activityContainer, toggleLayout)
178
193
179
194
wrapperLayout. setComponentAlignment(toggleLayout, Alignment . MIDDLE_RIGHT )
180
195
wrapperLayout. setWidthFull()
@@ -227,7 +242,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
227
242
grid. setWidthFull()
228
243
}
229
244
230
- private static void setupFilters (ListDataProvider<OfferOverview > offerOverviewDataProvider , Grid<? extends OfferOverview > grid ) {
245
+ private static void setupFilters (ListDataProvider<OfferOverview > offerOverviewDataProvider , Grid<? extends OfferOverview > grid ) {
231
246
HeaderRow headerFilterRow = grid. appendHeaderRow()
232
247
233
248
GridUtils . setupColumnFilter(offerOverviewDataProvider,
@@ -275,9 +290,9 @@ class OfferOverviewView extends VerticalLayout implements Observer {
275
290
}
276
291
277
292
private void setupGridListeners () {
278
- overviewGrid. addSelectionListener({ selection -> handleSelection(selection)}
293
+ overviewGrid. addSelectionListener({ selection -> handleSelection(selection) }
279
294
)
280
- overviewVersionsGrid. addSelectionListener({ selection -> handleSelection(selection)}
295
+ overviewVersionsGrid. addSelectionListener({ selection -> handleSelection(selection) }
281
296
)
282
297
}
283
298
@@ -290,7 +305,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
290
305
291
306
private void deselectOfferOverview () {
292
307
updateOfferBtn. setEnabled(false )
293
- downloadBtn . setEnabled(false )
308
+ downloadOfferBtn . setEnabled(false )
294
309
createProjectButton. setEnabled(false )
295
310
toggleVersions. setEnabled(false )
296
311
}
@@ -301,7 +316,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
301
316
UI . getCurrent(). setPollInterval(50 )
302
317
downloadSpinner. setVisible(true )
303
318
new LoadOfferInfoThread (UI . getCurrent(), overview). start()
304
- downloadBtn . setEnabled(true )
319
+ downloadOfferBtn . setEnabled(true )
305
320
updateOfferBtn. setEnabled(true )
306
321
toggleVersions. setEnabled(true )
307
322
checkProjectCreationAllowed(overview)
@@ -315,21 +330,29 @@ class OfferOverviewView extends VerticalLayout implements Observer {
315
330
}
316
331
}
317
332
318
- private void createResourceForDownload () {
319
- removeExistingResources ()
333
+ private void createResourceForOfferPdfDownload () {
334
+ removeExistingResourcesForOfferPdfDownload ()
320
335
321
336
StreamResource offerResource =
322
337
new StreamResource ((StreamResource.StreamSource res) -> {
323
338
return model. getOfferAsPdf()
324
339
}, 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)
327
350
}
328
351
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 )
333
356
}
334
357
})
335
358
}
@@ -362,7 +385,7 @@ class OfferOverviewView extends VerticalLayout implements Observer {
362
385
selectedOffer = overviewGrid. getSelectionModel(). getFirstSelectedItem()
363
386
})
364
387
offerOverviewController. fetchOffer(offerOverview. offerId)
365
- createResourceForDownload ()
388
+ createResourceForOfferPdfDownload ()
366
389
367
390
ui. access(() -> {
368
391
downloadSpinner. setVisible(false )
0 commit comments