extends
protected abstract void populateMetadataDetails();
/**
- * Default caption of header to be displayed when no data row selected in
+ * Default captionPrefix of header to be displayed when no data row selected in
* table.
*
* @return String
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java
index 99906b581..479505bc9 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java
@@ -79,8 +79,8 @@ public class SoftwareModuleDetailsTable extends Table {
* @param i18n
* I18N
* @param isUnassignSoftModAllowed
- * boolean flag to check for unassign functionality allowed for
- * the view.
+ * boolean flag to check for unassign functionality allowed for the
+ * view.
* @param distributionSetManagement
* DistributionSetManagement
* @param permissionChecker
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/DefaultGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/DefaultGridHeader.java
index bbb2acc39..4b62f40db 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/DefaultGridHeader.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/DefaultGridHeader.java
@@ -8,7 +8,6 @@
*/
package org.eclipse.hawkbit.ui.common.grid;
-import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
import org.eclipse.hawkbit.ui.components.SPUIButton;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleNoBorder;
@@ -16,13 +15,14 @@ import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
+import org.springframework.util.StringUtils;
import com.vaadin.server.FontAwesome;
-import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.themes.ValoTheme;
/**
* Abstract grid header placed on top of a grid.
@@ -34,6 +34,8 @@ public class DefaultGridHeader extends VerticalLayout {
private final String titleText;
private Label title;
+ private Label prefixText;
+ private HorizontalLayout prefixWithTitle;
private HorizontalLayout titleLayout;
private transient AbstractHeaderMaximizeSupport maximizeSupport;
@@ -67,24 +69,49 @@ public class DefaultGridHeader extends VerticalLayout {
* @return this DefaultGridHeader in order to allow method chaining
*/
public DefaultGridHeader init() {
- buildTitleLabel();
+ buildTitleHorizontalLayout();
buildTitleLayout();
buildComponent();
return this;
}
/**
- * Builds the title label.
+ * Builds the title HorizontalLayout containing two labels.
*
- * @return title-label
+ * @return title as HorizontalLayout
*/
- protected Label buildTitleLabel() {
- // create default title - even shown when no data is available
- title = new LabelBuilder().name(titleText).buildCaptionLabel();
- title.setImmediate(true);
- title.setContentMode(ContentMode.HTML);
+ protected HorizontalLayout buildTitleHorizontalLayout() {
- return title;
+ prefixText = new Label();
+ prefixText.setValue(titleText);
+ prefixText.addStyleName(ValoTheme.LABEL_SMALL);
+ prefixText.addStyleName(ValoTheme.LABEL_BOLD);
+ prefixText.setSizeUndefined();
+
+ title = new Label();
+ title.setSizeFull();
+ title.setImmediate(true);
+ title.setWidth("100%");
+ title.addStyleName(ValoTheme.LABEL_SMALL);
+ title.addStyleName("text-bold");
+ title.addStyleName("text-cut");
+ title.addStyleName("header-caption-right");
+
+ prefixWithTitle = new HorizontalLayout();
+ prefixWithTitle.setMargin(false);
+ prefixWithTitle.setSpacing(true);
+ prefixWithTitle.setSizeFull();
+ prefixWithTitle.addStyleName("header-caption");
+
+ prefixWithTitle.addComponent(prefixText);
+ prefixWithTitle.setComponentAlignment(prefixText, Alignment.TOP_LEFT);
+ prefixWithTitle.setExpandRatio(prefixText, 0.0F);
+
+ prefixWithTitle.addComponent(title);
+ prefixWithTitle.setComponentAlignment(title, Alignment.TOP_LEFT);
+ prefixWithTitle.setExpandRatio(title, 1.0F);
+
+ return prefixWithTitle;
}
/**
@@ -98,9 +125,9 @@ public class DefaultGridHeader extends VerticalLayout {
titleLayout.setSpacing(false);
titleLayout.setMargin(false);
titleLayout.setSizeFull();
- titleLayout.addComponent(title);
- titleLayout.setComponentAlignment(title, Alignment.TOP_LEFT);
- titleLayout.setExpandRatio(title, 0.8F);
+ titleLayout.addComponent(prefixWithTitle);
+ titleLayout.setComponentAlignment(prefixWithTitle, Alignment.TOP_LEFT);
+ titleLayout.setExpandRatio(prefixWithTitle, 0.8F);
if (hasHeaderMaximizeSupport()) {
titleLayout.addComponents(getHeaderMaximizeSupport().maxMinButton);
@@ -125,12 +152,12 @@ public class DefaultGridHeader extends VerticalLayout {
}
/**
- * Enables maximize-support for the header by setting a
- * HeaderMaximizeSupport implementation.
+ * Enables maximize-support for the header by setting a HeaderMaximizeSupport
+ * implementation.
*
* @param maximizeSupport
- * encapsulates layout of min-max-button and behavior for
- * minimize and maximize.
+ * encapsulates layout of min-max-button and behavior for minimize
+ * and maximize.
*/
public void setHeaderMaximizeSupport(final AbstractHeaderMaximizeSupport maximizeSupport) {
this.maximizeSupport = maximizeSupport;
@@ -140,8 +167,7 @@ public class DefaultGridHeader extends VerticalLayout {
* Gets the HeaderMaximizeSupport implementation describing behavior for
* minimize and maximize.
*
- * @return maximizeSupport that encapsulates behavior for minimize and
- * maximize.
+ * @return maximizeSupport that encapsulates behavior for minimize and maximize.
*/
public AbstractHeaderMaximizeSupport getHeaderMaximizeSupport() {
return maximizeSupport;
@@ -162,8 +188,15 @@ public class DefaultGridHeader extends VerticalLayout {
*
* @param newTitle
*/
- public void updateTitle(final String newTitle) {
- title.setValue(newTitle);
+ public void updateTitle(final String newTitle, final String hasTextCasePrefixText, final String hasNoTextCasePrefixText) {
+
+ if (StringUtils.hasText(newTitle)) {
+ prefixText.setValue(i18n.getMessage(hasTextCasePrefixText));
+ title.setValue(newTitle);
+ } else {
+ prefixText.setValue(i18n.getMessage(hasNoTextCasePrefixText));
+ title.setValue("");
+ }
}
/**
@@ -204,14 +237,12 @@ public class DefaultGridHeader extends VerticalLayout {
}
/**
- * Additional actions for maximize operation might be performed by this
- * method.
+ * Additional actions for maximize operation might be performed by this method.
*/
protected abstract void maximize();
/**
- * Additional actions for minimize operation might be performed by this
- * method.
+ * Additional actions for minimize operation might be performed by this method.
*/
protected abstract void minimize();
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java
index eed96ada4..3b6b77b44 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java
@@ -25,9 +25,11 @@ import com.vaadin.server.ExternalResource;
import com.vaadin.server.FontAwesome;
import com.vaadin.server.Resource;
import com.vaadin.shared.ui.label.ContentMode;
+import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Link;
import com.vaadin.ui.Panel;
@@ -44,6 +46,8 @@ import com.vaadin.ui.themes.ValoTheme;
public final class SPUIComponentProvider {
private static final Logger LOG = LoggerFactory.getLogger(SPUIComponentProvider.class);
+ private static final String LABEL_STYLE = "label-style";
+
/**
* Prevent Instance creation as utility class.
*/
@@ -202,10 +206,50 @@ public final class SPUIComponentProvider {
final Label nameValueLabel = new Label(getBoldHTMLText(label) + valueStr, ContentMode.HTML);
nameValueLabel.setSizeFull();
nameValueLabel.addStyleName(SPUIDefinitions.TEXT_STYLE);
- nameValueLabel.addStyleName("label-style");
+ nameValueLabel.addStyleName(LABEL_STYLE);
return nameValueLabel;
}
+ /**
+ * Method to CreateName value labels.
+ *
+ * @param label
+ * as string
+ * @param values
+ * as string
+ * @return HorizontalLayout
+ */
+ public static HorizontalLayout createNameValueLayout(final String label, final String... values) {
+ final String valueStr = StringUtils.arrayToDelimitedString(values, " ");
+
+ final Label nameValueLabel = new Label( label );
+ nameValueLabel.setContentMode(ContentMode.TEXT);
+ nameValueLabel.addStyleName(SPUIDefinitions.TEXT_STYLE);
+ nameValueLabel.addStyleName("text-bold");
+ nameValueLabel.setSizeUndefined();
+
+ final Label valueStrLabel = new Label(valueStr);
+ valueStrLabel.setWidth("100%");
+ valueStrLabel.addStyleName("text-cut");
+ valueStrLabel.addStyleName(SPUIDefinitions.TEXT_STYLE);
+ valueStrLabel.addStyleName(LABEL_STYLE);
+
+ final HorizontalLayout nameValueLayout = new HorizontalLayout();
+ nameValueLayout.setMargin(false);
+ nameValueLayout.setSpacing(true);
+ nameValueLayout.setSizeFull();
+
+ nameValueLayout.addComponent(nameValueLabel);
+ nameValueLayout.setComponentAlignment(nameValueLabel, Alignment.TOP_LEFT);
+ nameValueLayout.setExpandRatio(nameValueLabel, 0.0F);
+
+ nameValueLayout.addComponent(valueStrLabel);
+ nameValueLayout.setComponentAlignment(valueStrLabel, Alignment.TOP_LEFT);
+ nameValueLayout.setExpandRatio(valueStrLabel, 1.0F);
+
+ return nameValueLayout;
+ }
+
private static Label createUsernameLabel(final String label, final String username) {
String loadAndFormatUsername = "";
if (!StringUtils.isEmpty(username)) {
@@ -215,14 +259,14 @@ public final class SPUIComponentProvider {
final Label nameValueLabel = new Label(getBoldHTMLText(label) + loadAndFormatUsername, ContentMode.HTML);
nameValueLabel.setSizeFull();
nameValueLabel.addStyleName(SPUIDefinitions.TEXT_STYLE);
- nameValueLabel.addStyleName("label-style");
+ nameValueLabel.addStyleName(LABEL_STYLE);
nameValueLabel.setDescription(loadAndFormatUsername);
return nameValueLabel;
}
/**
- * Create label which represents the {@link BaseEntity#getCreatedBy()} by
- * user name
+ * Create label which represents the {@link BaseEntity#getCreatedBy()} by user
+ * name
*
* @param i18n
* the i18n
@@ -236,8 +280,8 @@ public final class SPUIComponentProvider {
}
/**
- * Create label which represents the {@link BaseEntity#getLastModifiedBy()}
- * by user name
+ * Create label which represents the {@link BaseEntity#getLastModifiedBy()} by
+ * user name
*
* @param i18n
* the i18n
@@ -306,11 +350,10 @@ public final class SPUIComponentProvider {
* @param icon
* of the link
* @param targetOpen
- * specify how the link should be open (f. e. new windows =
- * _blank)
+ * specify how the link should be open (f. e. new windows = _blank)
* @param style
- * chosen style of the link. Might be {@code null} if no style
- * should be used
+ * chosen style of the link. Might be {@code null} if no style should
+ * be used
* @return a link UI component
*/
public static Link getLink(final String id, final String name, final String resource, final FontAwesome icon,
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java
index 3c9afa8c0..d5bdfb1fe 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java
@@ -87,7 +87,7 @@ public class SwModuleDetails extends AbstractSoftwareModuleDetails {
}
private Button createShowArtifactDetailsButton() {
- artifactDetailsButton = SPUIComponentProvider.getButton("", "", "", null, false, FontAwesome.FILE_O,
+ artifactDetailsButton = SPUIComponentProvider.getButton(UIComponentIdProvider.UPLOAD_SW_MODULE_SHOW_ARTIFACT_DETAILS_BUTTON, "", "", null, false, FontAwesome.FILE_O,
SPUIButtonStyleNoBorder.class);
artifactDetailsButton.setDescription(getI18n().getMessage(UIMessageIdProvider.TOOLTIP_ARTIFACT_ICON));
artifactDetailsButton.addClickListener(event -> showArtifactDetailsWindow(getSelectedBaseEntity()));
@@ -96,9 +96,11 @@ public class SwModuleDetails extends AbstractSoftwareModuleDetails {
private void showArtifactDetailsWindow(final SoftwareModule softwareModule) {
final Window artifactDtlsWindow = new Window();
- artifactDtlsWindow.setCaption(HawkbitCommonUtil
- .getArtifactoryDetailsLabelId(softwareModule.getName() + "." + softwareModule.getVersion(), getI18n()));
- artifactDtlsWindow.setCaptionAsHtml(true);
+ artifactDtlsWindow.setId(UIComponentIdProvider.SHOW_ARTIFACT_DETAILS_POPUP_ID);
+ artifactDtlsWindow.setAssistivePrefix(HawkbitCommonUtil
+ .getArtifactoryDetailsLabelId(softwareModule.getName(), getI18n()) + " " + "");
+ artifactDtlsWindow.setCaption(softwareModule.getName() + ":" + softwareModule.getVersion());
+ artifactDtlsWindow.setAssistivePostfix("");
artifactDtlsWindow.setClosable(true);
artifactDtlsWindow.setResizable(true);
artifactDtlsWindow.setImmediate(true);
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java
index 7c916660f..0b03550c7 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java
@@ -21,7 +21,6 @@ import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
-import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
@@ -79,13 +78,12 @@ public class ActionHistoryLayout extends AbstractGridComponentLayout {
private String getActionHistoryCaption(final String targetName) {
final String caption;
if (StringUtils.hasText(targetName)) {
- caption = getI18n().getMessage(UIMessageIdProvider.CAPTION_ACTION_HISTORY_FOR,
- HawkbitCommonUtil.getBoldHTMLText(targetName));
+ caption = getI18n().getMessage(UIMessageIdProvider.CAPTION_ACTION_HISTORY_FOR, targetName);
} else {
caption = getI18n().getMessage(UIMessageIdProvider.CAPTION_ACTION_HISTORY);
}
- return HawkbitCommonUtil.getCaptionText(caption);
+ return caption;
}
@Override
@@ -113,12 +111,12 @@ public class ActionHistoryLayout extends AbstractGridComponentLayout {
}
/**
- * Override default registration for selection propagation in order to
- * interrupt update cascade in minimized state to prevent updates on
- * invisible action-status-grid and message-grid.
+ * Override default registration for selection propagation in order to interrupt
+ * update cascade in minimized state to prevent updates on invisible
+ * action-status-grid and message-grid.
*
- * The master selection is stored and propagation is performed as soon as
- * the state changes to maximize and hence the dependent grids are updated.
+ * The master selection is stored and propagation is performed as soon as the
+ * state changes to maximize and hence the dependent grids are updated.
*/
@Override
public void registerDetails(final AbstractGrid>.DetailsSupport details) {
@@ -188,7 +186,8 @@ public class ActionHistoryLayout extends AbstractGridComponentLayout {
* name of the target
*/
public void updateActionHistoryHeader(final String targetName) {
- updateTitle(getActionHistoryCaption(targetName));
+ updateTitle(targetName, UIMessageIdProvider.CAPTION_ACTION_HISTORY_FOR,
+ UIMessageIdProvider.CAPTION_ACTION_HISTORY);
}
/**
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/BulkUploadHandler.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/BulkUploadHandler.java
index 49a794f81..8475b0122 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/BulkUploadHandler.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/BulkUploadHandler.java
@@ -350,7 +350,7 @@ public class BulkUploadHandler extends CustomComponent
errorMessage.append(dsAssignmentFailedMsg);
}
if (errorMessage.length() > 0) {
- errorMessage.append("
");
+ errorMessage.append("\n");
}
if (tagAssignmentFailedMsg != null) {
errorMessage.append(tagAssignmentFailedMsg);
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java
index 8242f021f..d2f033b4c 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java
@@ -225,18 +225,18 @@ public class TargetDetails extends AbstractTableDetailsLayout {
private void populateDistributionDtls(final VerticalLayout layout, final DistributionSet distributionSet) {
layout.removeAllComponents();
- layout.addComponent(SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.name"),
+ layout.addComponent(SPUIComponentProvider.createNameValueLayout(getI18n().getMessage("label.dist.details.name"),
distributionSet == null ? "" : distributionSet.getName()));
layout.addComponent(
- SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.version"),
+ SPUIComponentProvider.createNameValueLayout(getI18n().getMessage("label.dist.details.version"),
distributionSet == null ? "" : distributionSet.getVersion()));
if (distributionSet == null) {
return;
}
distributionSet.getModules()
- .forEach(module -> layout.addComponent(getSWModlabel(module.getType().getName(), module)));
+ .forEach(module -> layout.addComponent(getSWModLayout(module.getType().getName(), module)));
}
private void updateAttributesLayout(final String controllerId) {
@@ -264,11 +264,11 @@ public class TargetDetails extends AbstractTableDetailsLayout {
final TreeMap sortedAttributes = new TreeMap<>((key1, key2) -> key1.compareToIgnoreCase(key2));
sortedAttributes.putAll(attributes);
sortedAttributes.forEach((key, value) -> {
- final Label conAttributeLabel = SPUIComponentProvider.createNameValueLabel(key.concat(" : "),
+ final HorizontalLayout conAttributeLayout = SPUIComponentProvider.createNameValueLayout(key.concat(" : "),
value == null ? "" : value);
- conAttributeLabel.setDescription(key.concat(" : ") + value);
- conAttributeLabel.addStyleName("label-style");
- attributesLayout.addComponent(conAttributeLabel);
+ conAttributeLayout.setDescription(key.concat(" : ") + value);
+ conAttributeLayout.addStyleName("label-style");
+ attributesLayout.addComponent(conAttributeLayout);
});
}
@@ -322,8 +322,9 @@ public class TargetDetails extends AbstractTableDetailsLayout {
* as Module (JVM|OS|AH)
* @return Label as UI
*/
- private static Label getSWModlabel(final String labelName, final SoftwareModule swModule) {
- return SPUIComponentProvider.createNameValueLabel(labelName + " : ", swModule.getName(), swModule.getVersion());
+ private static HorizontalLayout getSWModLayout(final String labelName, final SoftwareModule swModule) {
+ return SPUIComponentProvider.createNameValueLayout(labelName + " : ", swModule.getName(),
+ swModule.getVersion());
}
@Override
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java
index 3598c02e1..7b5953fec 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java
@@ -84,8 +84,8 @@ public final class HawkbitCommonUtil {
*
* @param text
* text to be trimmed
- * @return null if the text is null or if the text is blank, text.trim() if
- * the text is not empty.
+ * @return null if the text is null or if the text is blank, text.trim() if the
+ * text is not empty.
*/
public static String trimAndNullIfEmpty(final String text) {
if (text != null && !text.trim().isEmpty()) {
@@ -95,18 +95,16 @@ public final class HawkbitCommonUtil {
}
/**
- * Concatenate the given text all the string arguments with the given
- * delimiter.
+ * Concatenate the given text all the string arguments with the given delimiter.
*
* @param delimiter
* the delimiter text to be used while concatenation.
* @param texts
* all these string values will be concatenated with the given
* delimiter.
- * @return null in case no text arguments to be compared. just concatenation
- * of all texts arguments if "delimiter" is null or empty.
- * concatenation of all texts arguments with "delimiter" if it not
- * null.
+ * @return null in case no text arguments to be compared. just concatenation of
+ * all texts arguments if "delimiter" is null or empty. concatenation of
+ * all texts arguments with "delimiter" if it not null.
*/
public static String concatStrings(final String delimiter, final String... texts) {
final String delim = delimiter == null ? "" : delimiter;
@@ -140,21 +138,6 @@ public final class HawkbitCommonUtil {
return boldStr;
}
- /**
- * Get Label for Artifact Details.
- *
- * @param caption
- * as caption of the details
- * @param name
- * as name
- * @return SoftwareModuleName
- */
- public static String getSoftwareModuleName(final String caption, final String name) {
- return new StringBuilder()
- .append(DIV_DESCRIPTION_START + caption + " : " + getBoldHTMLText(getFormattedName(name)))
- .append(DIV_DESCRIPTION_END).toString();
- }
-
/**
* Get tool tip for Poll status.
*
@@ -181,7 +164,7 @@ public final class HawkbitCommonUtil {
* @return String formatted text
*/
public static String getFormattedName(final String orgText) {
- return trimAndNullIfEmpty(orgText) == null ? SPUIDefinitions.SPACE : orgText;
+ return trimAndNullIfEmpty(orgText) == null ? "" : orgText;
}
private static float findRequiredSwModuleExtraWidth(final float newBrowserWidth) {
@@ -246,10 +229,11 @@ public final class HawkbitCommonUtil {
* @return Label
*/
public static Label getFormatedLabel(final String labelContent) {
- final Label labelValue = new Label(labelContent, ContentMode.HTML);
+ final Label labelValue = new Label(labelContent, ContentMode.TEXT);
labelValue.setSizeFull();
labelValue.addStyleName(SPUIDefinitions.TEXT_STYLE);
labelValue.addStyleName("label-style");
+ labelValue.addStyleName("avoid-tooltip");
return labelValue;
}
@@ -301,20 +285,20 @@ public final class HawkbitCommonUtil {
final int unassignedCount = result.getUnassigned();
if (assignedCount == 1) {
formMsg.append(i18n.getMessage("message.target.assigned.one", result.getAssignedEntity().get(0).getName(),
- tagName)).append("
");
+ tagName)).append("\n");
} else if (assignedCount > 1) {
- formMsg.append(i18n.getMessage("message.target.assigned.many", assignedCount, tagName)).append("
");
+ formMsg.append(i18n.getMessage("message.target.assigned.many", assignedCount, tagName)).append("\n");
if (alreadyAssignedCount > 0) {
final String alreadyAssigned = i18n.getMessage("message.target.alreadyAssigned", alreadyAssignedCount);
- formMsg.append(alreadyAssigned).append("
");
+ formMsg.append(alreadyAssigned).append("\n");
}
}
if (unassignedCount == 1) {
formMsg.append(i18n.getMessage("message.target.unassigned.one",
- result.getUnassignedEntity().get(0).getName(), tagName)).append("
");
+ result.getUnassignedEntity().get(0).getName(), tagName)).append("\n");
} else if (unassignedCount > 1) {
- formMsg.append(i18n.getMessage("message.target.unassigned.many", unassignedCount, tagName)).append("
");
+ formMsg.append(i18n.getMessage("message.target.unassigned.many", unassignedCount, tagName)).append("\n");
}
return formMsg.toString();
}
@@ -552,14 +536,13 @@ public final class HawkbitCommonUtil {
* @return complete caption text of the table
*/
public static String getArtifactoryDetailsLabelId(final String name, final VaadinMessageSource i18n) {
- String caption;
+ final String caption;
if (StringUtils.hasText(name)) {
- caption = i18n.getMessage(UIMessageIdProvider.CAPTION_ARTIFACT_DETAILS_OF,
- HawkbitCommonUtil.getBoldHTMLText(name));
+ caption = i18n.getMessage(UIMessageIdProvider.CAPTION_ARTIFACT_DETAILS_OF);
} else {
caption = i18n.getMessage(UIMessageIdProvider.CAPTION_ARTIFACT_DETAILS);
}
- return getCaptionText(caption);
+ return caption;
}
/**
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/NotificationMessage.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/NotificationMessage.java
index 112532622..a5a6aaf13 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/NotificationMessage.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/NotificationMessage.java
@@ -65,7 +65,7 @@ public class NotificationMessage extends Notification {
setCaption(caption);
setDescription(description);
setStyleName(styleName);
- setHtmlContentAllowed(true);
+ setHtmlContentAllowed(false);
setPosition(Position.BOTTOM_RIGHT);
if (autoClose) {
setDelayMsec(SPUILabelDefinitions.SP_DELAY);
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java
index a521fb071..20fbd4ffc 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java
@@ -252,6 +252,16 @@ public final class SPUIStyleDefinitions {
*/
public static final String COLOR_LABEL_STYLE = "color-label-style";
+ /**
+ * Label bold style.
+ */
+ public static final String BOLD_LABEL_STYLE = "label-bold-style";
+
+ /**
+ * Label right padding style
+ */
+ public static final String RIGHT_PADDING_LABEL_STYLE = "header-caption-right";
+
/**
* Style - Message.
*/
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java
index aa4fbbd35..32c89a974 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java
@@ -445,6 +445,11 @@ public final class UIComponentIdProvider {
*/
public static final String UPLOAD_SW_MODULE_EDIT_BUTTON = "swmodule.edit.button";
+ /**
+ * Artifact upload - sw module show artifact details button id.
+ */
+ public static final String UPLOAD_SW_MODULE_SHOW_ARTIFACT_DETAILS_BUTTON = "swmodule.show.artifacts.details.button";
+
/**
* Artifact upload - sw module metadata button id.
*/
@@ -1167,6 +1172,11 @@ public final class UIComponentIdProvider {
*/
public static final String METADATA_POPUP_ID = "metadata.popup.id";
+ /**
+ * Show artifact details popup id.
+ */
+ public static final String SHOW_ARTIFACT_DETAILS_POPUP_ID = "show.artifact.details.popup.id";
+
/**
* Rollout popup id.
*/
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UINotification.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UINotification.java
index 96f04bf29..19cd9d43b 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UINotification.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UINotification.java
@@ -39,6 +39,7 @@ public class UINotification implements Serializable {
* is the message to displayed as success.
*/
public void displaySuccess(final String message) {
+ notificationMessage.setIcon(null);
notificationMessage.showNotification(SPUIStyleDefinitions.SP_NOTIFICATION_SUCCESS_MESSAGE_STYLE, null, message,
true);
}
@@ -50,6 +51,7 @@ public class UINotification implements Serializable {
* is the message to displayed as warning.
*/
public void displayWarning(final String message) {
+ notificationMessage.setIcon(null);
notificationMessage.showNotification(SPUIStyleDefinitions.SP_NOTIFICATION_WARNING_MESSAGE_STYLE, null, message,
true);
}
@@ -61,11 +63,10 @@ public class UINotification implements Serializable {
* as message.
*/
public void displayValidationError(final String message) {
- final StringBuilder updatedMsg = new StringBuilder(FontAwesome.EXCLAMATION_TRIANGLE.getHtml());
- updatedMsg.append(' ');
- updatedMsg.append(message);
- notificationMessage.showNotification(SPUIStyleDefinitions.SP_NOTIFICATION_ERROR_MESSAGE_STYLE, null,
- updatedMsg.toString(), true);
+ final StringBuilder updatedMsg = new StringBuilder(message);
+ notificationMessage.setIcon(FontAwesome.EXCLAMATION_TRIANGLE);
+ notificationMessage.showNotification(SPUIStyleDefinitions.SP_NOTIFICATION_ERROR_MESSAGE_STYLE, updatedMsg.toString(), null
+ , true);
}
}
diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/generic-styles.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/generic-styles.scss
index 8c2d88357..cacd9dca0 100644
--- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/generic-styles.scss
+++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/generic-styles.scss
@@ -38,7 +38,7 @@ $generic-text-font-size: $generic-text-font-scale * $v-font-size;
//Report widget max icon style
.icon-only {
- @include sp-icon-style($sp-button-size : $icon-font-size);
+ @include sp-icon-style($sp-button-size: $icon-font-size);
margin-bottom: 12px !important;
margin-right: 6px !important;
}
@@ -91,6 +91,39 @@ $generic-text-font-size: $generic-text-font-scale * $v-font-size;
-webkit-text-overflow: ellipsis;
}
+ .text-bold {
+ font-weight: bold !important;
+ }
+
+ .v-Notification-error .v-icon {
+ color: white;
+ }
+
+ .header-caption-right {
+ padding-right: 0.5em;
+ }
+
+ .avoid-tooltip {
+ pointer-events: none !important;
+ }
+
+ //This was needed to make the split of prefix "Artifact details of"
+ //and the actual value "smName:smVersion" in context of the XSS vulnerabilities
+ //possible after changing ContentMode
+ //from HTML to TEXT. As no Labels allowed at the windows caption field of the
+ //artifact details window , decision was made to use the methods
+ //Window.setAssistivePrefix() and Window.setAssistivePostfix() to solve the XSS-problem.
+ //Both, assistive postfix and prefix are usually not visible on the page and only for
+ //assistive purpose, but with overwriting this third party html class it's a possible
+ //workaround for the XSS vulnerability. I added a comment in the generic-styles.scss.
+ .v-assistive-device-only {
+ position: static;
+ top: auto;
+ left: auto;
+ width: auto;
+ overflow: visible;
+ }
+
.v-panel,
.v-textfield {
background: $widget-bg;
diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-window.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-window.scss
index 809547aa8..d24cbf7ee 100644
--- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-window.scss
+++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-window.scss
@@ -169,7 +169,7 @@
//confimation dialogue popup - Content margin adjustment
.confirmbox-question-label {
- margin: 0 8px 8px;
+ margin: 15px 8px 18px 8px;
}
.bulk-upload-button{
diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties
index d9fe9953f..dd05ef176 100644
--- a/hawkbit-ui/src/main/resources/messages.properties
+++ b/hawkbit-ui/src/main/resources/messages.properties
@@ -98,9 +98,9 @@ distribution.set.tag.updated.event.container.notifcation.message=distribution se
caption.filter.by.type = Filter by type
caption.bulk.upload = Bulk Upload
caption.action.history = Action history
-caption.action.history.for = Action history for {0}
+caption.action.history.for = Action history for
caption.artifact.details = Artifact Details
-caption.artifact.details.of = Artifact Details of {0}
+caption.artifact.details.of = Artifact Details of
caption.action.states= Action States
caption.action.messages = Messages
caption.error = Error