Skip to content

Commit 2be271b

Browse files
Merge pull request #158 from qbicsoftware/release/1.0.0-beta.4
Release 1.0.0 beta.4
2 parents 3b544ba + f60fb6f commit 2be271b

28 files changed

+778
-91
lines changed

.qube.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ full_name: Jennifer Bödker
33
44
project_name: Sample Tracking Status Overview
55
project_short_description: Gives a visual overview of sample statuses
6-
version: 1.0.0-beta.3
6+
version: 1.0.0-beta.4
77
domain: portlet
88
language: groovy
99
project_slug: Sample_Tracking_Status_Overview

CHANGELOG.rst

+13
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@ Changelog
44

55
This project adheres to `Semantic Versioning <https://semver.org/>`_.
66

7+
1.0.0-beta.4 (2021-11-22)
8+
---------------------------
9+
10+
**Added**
11+
12+
* Add sample view, showing all samples of a project with some sample details (`#150 <https://github.com/qbicsoftware/sample-tracking-status-overview/issues/150>`_)
13+
14+
**Fixed**
15+
16+
**Dependencies**
17+
18+
**Deprecated**
19+
720
1.0.0-beta.3 (2021-11-08)
821
---------------------------
922

docs/conf.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@
5757
# the built documents.
5858
#
5959
# The short X.Y version.
60-
version = '1.0.0-beta.3'
60+
version = '1.0.0-beta.4'
6161
# The full version, including alpha/beta/rc tags.
62-
release = '1.0.0-beta.3'
62+
release = '1.0.0-beta.4'
6363

6464
# The language for content autogenerated by Sphinx. Refer to documentation
6565
# for a list of supported languages.

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</modules>
1111
<artifactId>sample-tracking-status-overview</artifactId>
1212
<groupId>life.qbic</groupId>
13-
<version>1.0.0-beta.3</version> <!-- <<QUBE_FORCE_BUMP>> -->
13+
<version>1.0.0-beta.4</version> <!-- <<QUBE_FORCE_BUMP>> -->
1414
<name>Sample Tracking Status Overview</name>
1515
<url>http://github.com/qbicsoftware/sample-tracking-status-overview</url>
1616
<description>Gives a visual overview of sample statuses</description>

qube.cfg

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 1.0.0-beta.3
2+
current_version = 1.0.0-beta.4
33

44
[bumpversion_files_whitelisted]
55
dot_qube = .qube.yml

sample-tracking-status-overview-app/pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>sample-tracking-status-overview</artifactId>
77
<groupId>life.qbic</groupId>
8-
<version>1.0.0-beta.3</version> <!-- <<QUBE_FORCE_BUMP>> -->
8+
<version>1.0.0-beta.4</version> <!-- <<QUBE_FORCE_BUMP>> -->
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111
<packaging>war</packaging>
@@ -16,7 +16,7 @@
1616
<dependency>
1717
<groupId>life.qbic</groupId>
1818
<artifactId>sample-tracking-status-overview-domain</artifactId>
19-
<version>1.0.0-beta.3</version> <!-- <<QUBE_FORCE_BUMP>> -->
19+
<version>1.0.0-beta.4</version> <!-- <<QUBE_FORCE_BUMP>> -->
2020
<scope>compile</scope>
2121
</dependency>
2222
<dependency>

sample-tracking-status-overview-app/src/main/groovy/life/qbic/portal/sampletracking/DependencyManager.groovy

+30-8
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,24 @@ import life.qbic.business.samples.download.DownloadSamplesOutput
1717
import life.qbic.business.samples.info.GetSamplesInfo
1818
import life.qbic.business.samples.info.GetSamplesInfoDataSource
1919
import life.qbic.business.samples.info.GetSamplesInfoOutput
20+
import life.qbic.business.samples.info.SampleStatusDataSource
2021
import life.qbic.datamodel.dtos.portal.PortalUser
2122
import life.qbic.portal.sampletracking.communication.notification.MessageBroker
2223
import life.qbic.portal.sampletracking.communication.notification.NotificationService
24+
import life.qbic.portal.sampletracking.components.AppView
2325
import life.qbic.portal.sampletracking.components.NotificationHandler
2426
import life.qbic.portal.sampletracking.components.projectoverview.CountSamplesPresenter
2527
import life.qbic.portal.sampletracking.components.projectoverview.LoadProjectsPresenter
2628
import life.qbic.portal.sampletracking.components.projectoverview.ProjectOverviewView
2729
import life.qbic.portal.sampletracking.components.projectoverview.ProjectOverviewViewModel
2830
import life.qbic.portal.sampletracking.components.projectoverview.download.DownloadProjectController
2931
import life.qbic.portal.sampletracking.components.projectoverview.download.ManifestPresenter
32+
import life.qbic.portal.sampletracking.components.projectoverview.samplelist.FailedQCSamplesController
3033
import life.qbic.portal.sampletracking.components.projectoverview.samplelist.FailedQCSamplesView
31-
import life.qbic.portal.sampletracking.components.projectoverview.samplelist.ProjectOverviewController
3234
import life.qbic.portal.sampletracking.components.projectoverview.subscribe.SubscribeProjectController
3335
import life.qbic.portal.sampletracking.components.projectoverview.subscribe.SubscribeProjectPresenter
36+
import life.qbic.portal.sampletracking.components.sampleoverview.SampleOverviewView
37+
import life.qbic.portal.sampletracking.components.sampleoverview.SampleOverviewController
3438
import life.qbic.portal.sampletracking.datasources.Credentials
3539
import life.qbic.portal.sampletracking.datasources.OpenBisConnector
3640
import life.qbic.portal.sampletracking.datasources.database.DatabaseSession
@@ -65,6 +69,7 @@ class DependencyManager {
6569
private DownloadSamplesDataSource downloadSamplesDataSource
6670
private SubscriptionDataSource subscriptionDataSource
6771
private SubscribedProjectsDataSource subscribedProjectsDataSource
72+
private SampleStatusDataSource sampleStatusDataSource
6873

6974
private ResourceService<Project> projectResourceService
7075
private ResourceService<StatusCount> statusCountService
@@ -114,6 +119,8 @@ class DependencyManager {
114119
SamplesDbConnector samplesDbConnector = new SamplesDbConnector(DatabaseSession.getInstance())
115120
countSamplesDataSource = samplesDbConnector
116121
downloadSamplesDataSource = samplesDbConnector
122+
lastChangedDateDataSource = samplesDbConnector
123+
sampleStatusDataSource = samplesDbConnector
117124

118125
Credentials openBisCredentials = new Credentials(
119126
user: configurationManager.getDataSourceUser(),
@@ -142,7 +149,12 @@ class DependencyManager {
142149

143150
private VerticalLayout setupPortletView() {
144151
ProjectOverviewView projectOverviewView = createProjectOverviewView()
145-
return projectOverviewView
152+
SampleOverviewView sampleOverviewView = new SampleOverviewView(notificationService)
153+
SampleOverviewController projectSamplesController = setupProjectSamplesUseCase(sampleOverviewView.getPresenter())
154+
155+
156+
AppView mainView = new AppView(projectOverviewView, sampleOverviewView, projectSamplesController)
157+
return mainView
146158
}
147159

148160
/**
@@ -160,15 +172,25 @@ class DependencyManager {
160172
DownloadProjectController downloadController = setupDownloadProjectUseCase(viewModel)
161173

162174
FailedQCSamplesView failedQCSamplesView = new FailedQCSamplesView(notificationService)
163-
ProjectOverviewController projectOverviewController = setupFailedQCUseCase(failedQCSamplesView.getPresenter())
164-
165-
ProjectOverviewView view = new ProjectOverviewView(notificationService, viewModel, downloadController, failedQCSamplesView, projectOverviewController, subscribeProjectController)
175+
FailedQCSamplesController failedQCSamplesController = setupFailedQCUseCase(failedQCSamplesView.getPresenter())
176+
177+
ProjectOverviewView view = new ProjectOverviewView(notificationService,
178+
viewModel,
179+
downloadController,
180+
failedQCSamplesView,
181+
failedQCSamplesController,
182+
subscribeProjectController)
166183
return view
167184
}
168185

169-
private ProjectOverviewController setupFailedQCUseCase(GetSamplesInfoOutput output){
170-
GetSamplesInfo getSamplesInfo = new GetSamplesInfo(downloadSamplesDataSource,getSamplesInfoDataSource, output)
171-
return new ProjectOverviewController(getSamplesInfo)
186+
private SampleOverviewController setupProjectSamplesUseCase(GetSamplesInfoOutput output) {
187+
GetSamplesInfo getSamplesInfo = new GetSamplesInfo(sampleStatusDataSource, downloadSamplesDataSource, getSamplesInfoDataSource, output)
188+
return new SampleOverviewController(getSamplesInfo)
189+
}
190+
191+
private FailedQCSamplesController setupFailedQCUseCase(GetSamplesInfoOutput output){
192+
GetSamplesInfo getSamplesInfo = new GetSamplesInfo(sampleStatusDataSource, downloadSamplesDataSource,getSamplesInfoDataSource, output)
193+
return new FailedQCSamplesController(getSamplesInfo)
172194
}
173195

174196
private DownloadProjectController setupDownloadProjectUseCase(ProjectOverviewViewModel viewModel) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package life.qbic.portal.sampletracking.components
2+
3+
import com.vaadin.ui.Button
4+
import com.vaadin.ui.Component
5+
import com.vaadin.ui.Grid
6+
import com.vaadin.ui.HorizontalLayout
7+
import com.vaadin.ui.Label
8+
import com.vaadin.ui.VerticalLayout
9+
import com.vaadin.ui.components.grid.ItemClickListener
10+
import com.vaadin.ui.themes.ValoTheme
11+
import life.qbic.portal.sampletracking.components.projectoverview.ProjectOverviewView
12+
import life.qbic.portal.sampletracking.components.projectoverview.ProjectSummary
13+
import life.qbic.portal.sampletracking.components.sampleoverview.SampleOverviewController
14+
import life.qbic.portal.sampletracking.components.sampleoverview.SampleOverviewView
15+
import life.qbic.portal.sampletracking.components.toggle.ToggleButton
16+
17+
/**
18+
* <b>The application view component</b>
19+
*
20+
* <p>This is the orchestrating root element of the view hierarchy.</p>
21+
*
22+
* @since 1.0.0
23+
*/
24+
class AppView extends VerticalLayout {
25+
26+
private final ProjectOverviewView projectOverviewView
27+
private final SampleOverviewView sampleOverviewView
28+
private final SampleOverviewController sampleOverviewController
29+
30+
private final HorizontalLayout hotbar = new HorizontalLayout()
31+
protected final Label titleLabel = new Label("Sample Status Portlet")
32+
private final ToggleButton projectSampleToggle
33+
34+
AppView(ProjectOverviewView projectOverviewView, SampleOverviewView sampleOverviewView, SampleOverviewController sampleOverviewController) {
35+
this.setMargin(true)
36+
this.setSpacing(true)
37+
38+
titleLabel.addStyleName(ValoTheme.LABEL_HUGE)
39+
40+
this.projectOverviewView = projectOverviewView
41+
this.sampleOverviewView = sampleOverviewView
42+
this.sampleOverviewController = sampleOverviewController
43+
44+
projectSampleToggle = setupProjectSampleToggle()
45+
46+
addToggleButtonListeners()
47+
listenToProjectSelectionChange()
48+
49+
hotbar.addComponentAsFirst(projectSampleToggle)
50+
addHotbarItem(projectOverviewView.getHotbar())
51+
addHotbarItem(sampleOverviewView.getHotbar())
52+
showProjectView(true)
53+
showSampleView(false)
54+
55+
this.addComponents(titleLabel, createSpacer(2, Unit.EM), hotbar, projectOverviewView, sampleOverviewView)
56+
}
57+
58+
59+
private void listenToProjectSelectionChange(){
60+
projectOverviewView.onSelectedProjectChange({
61+
if (it) {
62+
projectSampleToggle.setEnabled(true)
63+
sampleOverviewController.getSamplesFor(it.code)
64+
} else {
65+
projectSampleToggle.setEnabled(false)
66+
sampleOverviewView.reset()
67+
}
68+
})
69+
}
70+
71+
private void showProjectView(Boolean visible) {
72+
projectOverviewView.setVisible(visible)
73+
projectOverviewView.getHotbar().setVisible(visible)
74+
if (visible) this.titleLabel.value = projectOverviewView.getTitle()
75+
}
76+
77+
private void showSampleView(Boolean visible) {
78+
sampleOverviewView.setVisible(visible)
79+
sampleOverviewView.getHotbar().setVisible(visible)
80+
if (visible) this.titleLabel.value = sampleOverviewView.getTitle()
81+
}
82+
83+
private void addHotbarItem(HorizontalLayout item) {
84+
this.hotbar.addComponent(item)
85+
}
86+
87+
88+
private void addToggleButtonListeners() {
89+
def switchToSampleView = {
90+
showProjectView(false)
91+
showSampleView(true)
92+
}
93+
def switchToProjectView = {
94+
showSampleView(false)
95+
showProjectView(true)
96+
}
97+
projectSampleToggle.addClickListener(switchToSampleView, ToggleButton.State.ONE)
98+
projectSampleToggle.addClickListener(switchToProjectView, ToggleButton.State.TWO)
99+
100+
projectOverviewView.onProjectDoubleClick({
101+
sampleOverviewController.getSamplesFor(it.code)
102+
projectSampleToggle.click()
103+
})
104+
}
105+
106+
private static Component createSpacer(float height, Unit unit) {
107+
Label label = new Label(" ")
108+
label.setHeight(height, unit)
109+
return label
110+
}
111+
112+
private static ToggleButton setupProjectSampleToggle() {
113+
ToggleButton toggleButton = new ToggleButton("Show Samples", "Show Projects")
114+
toggleButton.setEnabled(false)
115+
116+
return toggleButton
117+
}
118+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package life.qbic.portal.sampletracking.components
2+
3+
import com.vaadin.ui.HorizontalLayout
4+
5+
/**
6+
* <b>Provides hotbar controls to be shown in a managing view</b>
7+
*
8+
* @since 1.0.0
9+
*/
10+
interface HasHotbar {
11+
/**
12+
* Provides hotbar controls to be shown in a managing view
13+
* @return a horizontal layout with hotbar content
14+
*/
15+
HorizontalLayout getHotbar()
16+
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package life.qbic.portal.sampletracking.components
2+
3+
/**
4+
* <b>This class provides a title</b>
5+
*
6+
* @since 1.0.0
7+
*/
8+
interface HasTitle {
9+
10+
/**
11+
* Provides a title
12+
* @return a title
13+
*/
14+
String getTitle()
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package life.qbic.portal.sampletracking.components
2+
3+
/**
4+
* <b>Should be implemented by all views that are resettable</b>
5+
*
6+
* @since 1.0.0
7+
*/
8+
interface Resettable {
9+
10+
/**
11+
* Resets the underlying viewmodel of the implementing view
12+
*/
13+
void reset()
14+
15+
}

0 commit comments

Comments
 (0)