Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overhaul project summary page #859

Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
7a297ce
Draft scaffold
sven1103 Oct 21, 2024
e1f6130
Checkin current progress
sven1103 Oct 22, 2024
d3ba5f9
Checkin current progress
sven1103 Oct 22, 2024
6d206c2
Checkin daily progress
sven1103 Oct 22, 2024
03b1668
Checkin current progress
sven1103 Oct 23, 2024
888d6ef
Checkin progress
sven1103 Oct 23, 2024
742d50f
Checkin progress
sven1103 Oct 24, 2024
682e0a0
Checkin current progress
sven1103 Oct 24, 2024
e4e49f9
Checkin progress
sven1103 Oct 24, 2024
8db15d5
Checkin progress
sven1103 Oct 24, 2024
91e22d0
Checkin fix
sven1103 Oct 24, 2024
3a02d7d
Checkin progress
sven1103 Oct 25, 2024
d1f1a7c
Checkin progress
sven1103 Oct 25, 2024
7e6749f
Checkin edit use case funding
sven1103 Nov 5, 2024
60f5a10
Refactor funding info
sven1103 Nov 5, 2024
99bb33d
Merge branch 'development' into feature/#812-improve-the-project-summ…
sven1103 Nov 5, 2024
0872502
Refactor action bar
sven1103 Nov 6, 2024
77977d3
Merge branch 'feature/#812-improve-the-project-summary-view-for-bette…
sven1103 Nov 6, 2024
e241f63
Provide JDs
sven1103 Nov 6, 2024
9c7c0dd
More JDs
sven1103 Nov 6, 2024
3021c92
Checkin
sven1103 Nov 6, 2024
3d2e06a
Checkin
sven1103 Nov 7, 2024
75b8d69
Checkin
sven1103 Nov 7, 2024
9358b11
Checking work
sven1103 Nov 7, 2024
3eebc9e
Clean up
sven1103 Nov 8, 2024
9b12fcc
Checkin
sven1103 Nov 8, 2024
7cabcb3
Delelte empty and orphaned classes
sven1103 Nov 8, 2024
933a2f4
Adjust contact box width
sven1103 Nov 8, 2024
a1875bd
Add class annotation to contact section content
sven1103 Nov 8, 2024
7ce26e6
Enable to delete funding information
sven1103 Nov 13, 2024
e4b942b
Checkin progress
sven1103 Nov 13, 2024
e4d698f
Enable validation
sven1103 Nov 13, 2024
4b46b0a
Add JDs
sven1103 Nov 13, 2024
0470b0e
Address change requests
sven1103 Nov 13, 2024
d07834b
Merge branch 'development' into feature/#812-improve-the-project-summ…
Steffengreiner Nov 13, 2024
24f2231
Optimize imports
sven1103 Nov 14, 2024
bed2cf3
Hide factory constructor
sven1103 Nov 14, 2024
d1d2b17
Reduce side effect risk
sven1103 Nov 14, 2024
6a97c0e
Make fields transient
sven1103 Nov 14, 2024
521e15d
Address severity issues
sven1103 Nov 14, 2024
e23bb30
Add transient modifier to fields
sven1103 Nov 14, 2024
3dcb13f
More fixes
sven1103 Nov 14, 2024
a4634cb
More improvements
sven1103 Nov 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -153,15 +153,15 @@ public void setResponsibility(ProjectId projectId, Contact contact) {
}

@PreAuthorize("hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE')")
public void stateObjective(ProjectId projectId, String objective) {
public void updateObjective(ProjectId projectId, String objective) {
ProjectObjective projectObjective = ProjectObjective.create(objective);
Project project = loadProject(projectId);
project.stateObjective(projectObjective);
projectRepository.update(project);
}

@PreAuthorize("hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE')")
public void addFunding(ProjectId projectId, String label, String referenceId) {
public void setFunding(ProjectId projectId, String label, String referenceId) {
Funding funding = Funding.of(label, referenceId);
var project = loadProject(projectId);
project.setFunding(funding);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,10 @@ public List<ExperimentId> experiments() {
return experiments.stream().map(Experiment::experimentId).toList();
}

public Instant getLastModified() {
return lastModified;
}

@Override
public boolean equals(Object o) {
if (this == o) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class ProjectInformationServiceSpec extends Specification {

when: "the project objective is updated for a project"
String projectObjective = "All your objectives are belong to us"
projectInformationService.stateObjective(project.getId(), projectObjective)
projectInformationService.updateObjective(project.getId(), projectObjective)

then: "the project intent contains the new project objective"
project.projectIntent.objective().objective() == projectObjective
Expand Down
209 changes: 209 additions & 0 deletions user-interface/frontend/themes/datamanager/components/all.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
.flex-horizontal {
display: flex;
flex-direction: row;
}
Comment on lines +1 to +4
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm unclear on the purpose of the all.css class?
I guess that we're moving into having all css into a singular file as @KochTobi suggested or is it css classes that are used in general components? Maybe a small comment would help her?


.heading-with-icon {
color: #878787;
column-gap: var(--lumo-space-s);
display: flex;
flex-direction: row;
font-weight: bold;
line-height: 1;
font-size: var(--lumo-space-m);
}

.heading-with-icon vaadin-icon {
height: auto;
}

.section {
width: 100%;
}

.full-width {
width: 100%;
}

.section-header {
display: flex;
flex-direction: column;
width: 100%;
}


.trailing-margin-large {
margin-bottom: var(--lumo-space-xl);
}

.trailing-margin-normal {
margin-bottom: var(--lumo-space-l);
}

.trailing-margin-small {
margin-bottom: var(--lumo-space-s);
}

.section-header-row {
display: flex;
width: 100%;
}

.section-content {
display: flex;
flex-direction: column;
width: 100%;
row-gap: var(--lumo-space-m);
}

.section-title {
font-weight: bold;
color: var(--lumo-secondary-text-color);
margin-bottom: 0.5rem;
width: 100%;
}

.font-size-small {
font-size: var(--lumo-font-size-l);
}

.font-size-medium {
font-size: var(--lumo-font-size-xl);
}

.font-size-large {
font-size: var(--lumo-font-size-xxl);
}

.sub-header {
font-size: var(--lumo-font-size-s);
color: #878787;
margin-bottom: 0.5rem;
}

.tag-list {
width: 100%;
display: flex;
}

.detail-box {
display: flex;
flex-direction: column;
border: 1px solid lightgray;
border-radius: var(--lumo-space-s);
max-height: 10rem;
}

.detail-box-header {
display: flex;
flex-direction: row;
width: 100%;
gap: var(--lumo-space-s);
font-size: var(--lumo-font-size-m);
font-weight: bold;
color: #878787;
line-height: 1;
}

.detail-box-header vaadin-icon {
height: auto;
}

.detail-box-child {
border-width: 1px 1px 1px 1px;
border-color: lightgray;
padding: var(--lumo-space-m) var(--lumo-space-m) var(--lumo-space-m);
}

.detail-box-child:first-child {
border-width: 0 0 1px 0;
border-style: solid;
border-color: lightgray;
}

.icon-label {
font-size: var(--lumo-font-size-m);
line-height: 1;
display: flex;
flex-direction: row;
gap: var(--lumo-space-l);
}

.icon-label-container {
display: flex;
flex-direction: row;
font-size: var(--lumo-font-size-m);
color: #878787;
font-weight: bold;
gap: var(--lumo-space-s);
}

.icon-label-container vaadin-icon {
height: auto;
}

.vertical-list {
display: flex;
flex-direction: column;
width: 100%;
}

.horizontal-list {
display: flex;
flex-direction: row;
width: 100%;
}

.dynamic-growing-flex-item {
flex-grow: 1;
}

.wrapping-flex-container {
flex-wrap: wrap;
}

.overflow-hidden-ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

.gap-large {
gap: var(--lumo-space-l);
}

.gap-medium {
gap: var(--lumo-space-m);
}

.gap-small {
gap: var(--lumo-space-s);
}

.allow-row-wrap {
flex-wrap: wrap;
}

.overflow-scroll-height {
overflow: auto;
}

.ontology-term {
width: 100%;
display: flex;
flex-direction: row;
gap: var(--lumo-space-s);
white-space: nowrap;
flex-wrap: wrap;
}

.fixed-medium-width {
width: 25rem;
}

.simple-paragraph {
font-size: var(--lumo-font-size-m);
margin-bottom: var(--lumo-space-m);
max-width: 40em;
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* This file defines the styling and layout for all custom components. The components are sorted alphabetically */

/*Make sure to import the css classes for each custom component to avoid cluttering the master-style-sheet */
@import "all.css";
@import "button.css";
@import "card.css";
@import "combobox.css";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ vaadin-dialog-overlay::part(title) {
margin-inline-start: 0;
}

.large-dialog::part(overlay) {
width: 66vw;
}

/* set the width of the notification */
.notification-dialog::part(overlay) {
width: 36.75rem;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

.page-area {
background-color: var(--lumo-base-color);
padding: var(--lumo-space-m);
padding: var(--lumo-space-l);
flex-direction: column;
display: flex;
gap: var(--lumo-space-s);
Expand Down
3 changes: 2 additions & 1 deletion user-interface/frontend/themes/datamanager/styles.css
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
@import "theme-editor.css";
@import "components/custom.css";
@import "components/vaadin-custom.css";
@import "components/vaadin-custom.css";
Binary file modified user-interface/src/main/bundles/dev.bundle
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package life.qbic.datamanager.views;

/**
* <b><enum short description - 1 Line!></b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
*
* @since <version tag>
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing JD

public enum MeasurementType {
PROTEOMICS("Proteomics"),
GENOMICS("Genomics");

private final String type;

MeasurementType(String type) {
this.type = type;
}

public String getType() {
return type;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package life.qbic.datamanager.views;

import life.qbic.datamanager.views.general.Tag;
import life.qbic.datamanager.views.general.Tag.TagColor;

/**
* <b><class short description - 1 Line!></b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
*
* @since <version tag>
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing JD

public class TagFactory {

public static Tag forMeasurement(MeasurementType measurementType) {
return switch (measurementType) {
case GENOMICS -> violetTag("Genomics");
case PROTEOMICS -> pinkTag("Proteomics");
};
}

private static Tag tagWithColor(String label, TagColor color) {
var tag = new Tag(label);
tag.setTagColor(color);
return tag;
}

private static Tag violetTag(String label) {
return tagWithColor(label, TagColor.VIOLET);
}

private static Tag pinkTag(String label) {
return tagWithColor(label, TagColor.PINK);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package life.qbic.datamanager.views.events;

import com.vaadin.flow.component.ComponentEvent;
import java.util.Objects;
import java.util.Optional;
import life.qbic.datamanager.views.projects.edit.EditContactDialog;
import life.qbic.datamanager.views.projects.ProjectInformation;

/**
* <b><class short description - 1 Line!></b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
*
* @since <version tag>
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing JD

public class ContactUpdateEvent extends ComponentEvent<EditContactDialog> {

private final ProjectInformation projectInfo;

/**
* Creates a new event using the given source and indicator whether the event originated from the
* client side or the server side.
*
* @param source the source component
* @param fromClient <code>true</code> if the event originated from the client
* side, <code>false</code> otherwise
*/
public ContactUpdateEvent(EditContactDialog source, boolean fromClient, ProjectInformation projectInformation) {
super(source, fromClient);
this.projectInfo = Objects.requireNonNull(projectInformation);
}

public Optional<ProjectInformation> content() {
return Optional.ofNullable(projectInfo);
}
}
Loading