Merge branch 'master' into fix_rolloutmanagement_transaction_handling_deadlock
This commit is contained in:
0
3rd-dependencies/listDeps.sh
Executable file → Normal file
0
3rd-dependencies/listDeps.sh
Executable file → Normal file
@@ -86,8 +86,11 @@ public class SimulationController {
|
||||
final String deviceId = name + i;
|
||||
repository.add(deviceFactory.createSimulatedDevice(deviceId, tenant, protocol, pollDelay, new URL(endpoint),
|
||||
gatewayToken));
|
||||
|
||||
if (protocol == Protocol.DMF_AMQP) {
|
||||
spSenderService.createOrUpdateThing(tenant, deviceId);
|
||||
}
|
||||
}
|
||||
|
||||
return ResponseEntity.ok("Updated " + amount + " DMF connected targets!");
|
||||
}
|
||||
|
||||
@@ -11,10 +11,12 @@ package org.eclipse.hawkbit.simulator;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
|
||||
import org.eclipse.hawkbit.simulator.AbstractSimulatedDevice.Protocol;
|
||||
import org.eclipse.hawkbit.simulator.amqp.SpSenderService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.ContextRefreshedEvent;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -24,6 +26,7 @@ import org.springframework.stereotype.Component;
|
||||
*
|
||||
*/
|
||||
@Component
|
||||
@ConditionalOnProperty(prefix = "hawkbit.device.simulator", name = "autostart", matchIfMissing = true)
|
||||
public class SimulatorStartup implements ApplicationListener<ContextRefreshedEvent> {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(SimulatorStartup.class);
|
||||
|
||||
@@ -52,8 +55,10 @@ public class SimulatorStartup implements ApplicationListener<ContextRefreshedEve
|
||||
LOGGER.error("Creation of simulated device at startup failed.", e);
|
||||
}
|
||||
|
||||
if (autostart.getApi() == Protocol.DMF_AMQP) {
|
||||
spSenderService.createOrUpdateThing(autostart.getTenant(), deviceId);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,6 @@ package org.eclipse.hawkbit;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.transaction.Transaction;
|
||||
|
||||
import org.eclipse.hawkbit.repository.RolloutManagement;
|
||||
import org.eclipse.hawkbit.repository.SystemManagement;
|
||||
import org.eclipse.hawkbit.repository.exception.TenantNotExistException;
|
||||
import org.eclipse.hawkbit.tenancy.TenantAware;
|
||||
import org.eclipse.persistence.config.PersistenceUnitProperties;
|
||||
@@ -42,34 +40,12 @@ public class MultiTenantJpaTransactionManager extends JpaTransactionManager {
|
||||
.getResource(getEntityManagerFactory());
|
||||
final EntityManager em = emHolder.getEntityManager();
|
||||
|
||||
if (notTenantManagement(definition) && notCurrentTenantKeyGenerator(definition)
|
||||
&& notRolloutScheduler(definition) && notGetOrCreateTenantMetadata(definition)) {
|
||||
|
||||
final String currentTenant = tenantAware.getCurrentTenant();
|
||||
if (currentTenant == null) {
|
||||
throw new TenantNotExistException("Tenant Unknown. Canceling transaction.");
|
||||
}
|
||||
|
||||
em.setProperty(PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT, currentTenant.toUpperCase());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean notGetOrCreateTenantMetadata(final TransactionDefinition definition) {
|
||||
return !definition.getName()
|
||||
.startsWith(SystemManagement.class.getCanonicalName() + ".getOrCreateTenantMetadata");
|
||||
}
|
||||
|
||||
private boolean notRolloutScheduler(final TransactionDefinition definition) {
|
||||
return !definition.getName().startsWith(RolloutManagement.class.getCanonicalName() + ".rolloutScheduler");
|
||||
}
|
||||
|
||||
private boolean notCurrentTenantKeyGenerator(final TransactionDefinition definition) {
|
||||
return !definition.getName()
|
||||
.startsWith(SystemManagement.class.getCanonicalName() + ".currentTenantKeyGenerator");
|
||||
}
|
||||
|
||||
private boolean notTenantManagement(final TransactionDefinition definition) {
|
||||
return !definition.getName().startsWith(SystemManagement.class.getCanonicalName() + ".deleteTenant")
|
||||
&& !definition.getName().startsWith(SystemManagement.class.getCanonicalName() + ".findTenants");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,7 @@ public class SystemManagement {
|
||||
* @return the {@link CurrentTenantKeyGenerator}
|
||||
*/
|
||||
@Bean
|
||||
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
||||
public CurrentTenantKeyGenerator currentTenantKeyGenerator() {
|
||||
return new CurrentTenantKeyGenerator();
|
||||
}
|
||||
@@ -206,7 +207,6 @@ public class SystemManagement {
|
||||
@NotNull
|
||||
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_SYSTEM_ADMIN + SpringEvalExpressions.HAS_AUTH_OR
|
||||
+ SpringEvalExpressions.IS_SYSTEM_CODE)
|
||||
// tenant independent
|
||||
public List<String> findTenants() {
|
||||
return tenantMetaDataRepository.findAll().stream().map(md -> md.getTenant()).collect(Collectors.toList());
|
||||
}
|
||||
@@ -221,7 +221,6 @@ public class SystemManagement {
|
||||
@Transactional
|
||||
@Modifying
|
||||
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_SYSTEM_ADMIN)
|
||||
// tenant independent
|
||||
public void deleteTenant(@NotNull final String tenant) {
|
||||
cacheManager.evictCaches(tenant);
|
||||
cacheManager.getCache("currentTenant").evict(currentTenantKeyGenerator().generate(null, null));
|
||||
|
||||
@@ -78,6 +78,22 @@ public class MultiTenancyEntityTest extends AbstractIntegrationTest {
|
||||
assertThat(findTargetsForTenant).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description(value = "Ensures that tenant with proper permissions can read and delete other tenants.")
|
||||
@WithUser(tenantId = "mytenant", allSpPermissions = true)
|
||||
public void deleteAnotherTenantPossible() throws Exception {
|
||||
// create target for another tenant
|
||||
final String anotherTenant = "anotherTenant";
|
||||
final String controllerAnotherTenant = "anotherController";
|
||||
createTargetForTenant(controllerAnotherTenant, anotherTenant);
|
||||
|
||||
assertThat(systemManagement.findTenants()).as("Expected number if tenants before deletion is").hasSize(3);
|
||||
|
||||
systemManagement.deleteTenant(anotherTenant);
|
||||
|
||||
assertThat(systemManagement.findTenants()).as("Expected number if tenants after deletion is").hasSize(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Description(value = "Ensures that tenant metadata is retrieved for the current tenant.")
|
||||
@WithUser(tenantId = "mytenant", autoCreateTenant = false, allSpPermissions = true)
|
||||
|
||||
34
hawkbit-ui/README.md
Normal file
34
hawkbit-ui/README.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# hawkBit User Interface
|
||||
|
||||
The hawkBit user interface is based on the Vaadin and Vaadin-Spring framework and allows to manage software updates and large scale roll-outs via a user interface.
|
||||
|
||||
## Debugging client-side code
|
||||
### Debug using SuperDevMode
|
||||
The SuperDevMode can be used to debug client side code without any browser plugin.
|
||||
|
||||
#### Using SuperDevMode with chrome :
|
||||
|
||||
- Add required maven dependencies
|
||||
- Add vaadin-client-compiler dependency
|
||||
- Add jetty dependencies (version : 8.1x)
|
||||
- Set redirect property in the AppWidgetSet.gwt.xml module descriptor as follows
|
||||
- < set-configuration-property name="devModeRedirectEnabled" value="true" />
|
||||
- Create launch configuration for the SuperDevMode
|
||||
- The main class to execute should be com.google.gwt.dev.codeserver.CodeServer.
|
||||
- Add fully-qualified class name of widgetset (org.eclipse.hawkbit.ui.AppWidgetSet) as parameter
|
||||
- Enable debug in chrome
|
||||
- Chrome inspector window ▸ Click on settings icon ▸ Scripts ▸ Enable source maps option
|
||||
- Run the SuperDevMode Code Server with the launch configuration created above
|
||||
- Open http://localhost:8080/UI/?debug .Click on "SuperDev" button in debug console (Alternatively can directly add ?superdevmode parameter to URL)
|
||||
- Widgetset is compiled and you can see the java code files loaded in 'Chrome inspector window ▸ Source tab'
|
||||
|
||||
|
||||
#### Using SuperDevMode with Eclipse :
|
||||
|
||||
- Install the plugin from http://sdbg.github.io/p2
|
||||
- Start the server and Super Dev Mode as mentioned above
|
||||
- Create a new launch configuration in Eclipse
|
||||
- Type is "Launch Chrome"
|
||||
- http://localhost:8080/UI/?superdevmode
|
||||
- Launch the new configuration in debug mode
|
||||
- Now breakpoints in eclipse can be set
|
||||
@@ -16,6 +16,7 @@ import org.eclipse.hawkbit.repository.OffsetBasedPageRequest;
|
||||
import org.eclipse.hawkbit.repository.SoftwareManagement;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
@@ -101,8 +102,8 @@ public class BaseSwModuleBeanQuery extends AbstractBeanQuery<ProxyBaseSoftwareMo
|
||||
proxy.setVersion(bean.getVersion());
|
||||
proxy.setVendor(bean.getVendor());
|
||||
proxy.setDescription(bean.getDescription());
|
||||
proxy.setCreatedByUser(HawkbitCommonUtil.getIMUser(bean.getCreatedBy()));
|
||||
proxy.setModifiedByUser(HawkbitCommonUtil.getIMUser(bean.getLastModifiedBy()));
|
||||
proxy.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(bean));
|
||||
proxy.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(bean));
|
||||
return proxy;
|
||||
}
|
||||
|
||||
|
||||
@@ -240,6 +240,7 @@ public class SoftwareModuleAddUpdateWindow implements Serializable {
|
||||
SPUIDefinitions.CREATE_UPDATE_WINDOW);
|
||||
window.setContent(mainLayout);
|
||||
window.setModal(true);
|
||||
nameTextField.focus();
|
||||
}
|
||||
|
||||
private void addDescriptionTextChangeListener() {
|
||||
|
||||
@@ -257,6 +257,7 @@ public class CreateUpdateSoftwareTypeLayout extends CustomComponent implements C
|
||||
mainLayout = new HorizontalLayout();
|
||||
mainLayout.addComponent(fieldButtonLayout);
|
||||
setCompositionRoot(mainLayout);
|
||||
typeName.focus();
|
||||
}
|
||||
|
||||
private void addListeners() {
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.common;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.eclipse.hawkbit.im.authentication.UserPrincipal;
|
||||
import org.eclipse.hawkbit.repository.model.BaseEntity;
|
||||
import org.eclipse.hawkbit.ui.utils.SpringContextHelper;
|
||||
import org.springframework.security.core.context.SecurityContext;
|
||||
import org.springframework.security.core.userdetails.User;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
|
||||
|
||||
import com.vaadin.server.VaadinService;
|
||||
|
||||
/**
|
||||
* A Utility class to user details e.g. username
|
||||
*/
|
||||
public final class UserDetailsFormatter {
|
||||
|
||||
private static final String TRIM_APPENDIX = "...";
|
||||
private static final String DETAIL_SEPERATOR = ", ";
|
||||
|
||||
private UserDetailsFormatter() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Load user details by the user name and format the user name to max 100
|
||||
* characters.
|
||||
*
|
||||
* @see {@link UserDetailsFormatter#loadAndFormatUsername(String, int)}
|
||||
*
|
||||
* @param username
|
||||
* the user name
|
||||
* @return the formatted user name (max 100 characters) cannot be <null>
|
||||
*/
|
||||
public static String loadAndFormatUsername(final String username) {
|
||||
return loadAndFormatUsername(username, 100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load user details by {@link BaseEntity#getCreatedBy()} and format the
|
||||
* user name. Use {@link UserDetailsFormatter#loadAndFormatUsername(String)}
|
||||
*
|
||||
* @param baseEntity
|
||||
* the entity
|
||||
* @return the formatted 'created at user name' (max 100 characters) cannot
|
||||
* be <null>
|
||||
*/
|
||||
public static String loadAndFormatCreatedBy(final BaseEntity baseEntity) {
|
||||
if (baseEntity == null || baseEntity.getCreatedBy() == null) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
return loadAndFormatUsername(baseEntity.getCreatedBy());
|
||||
}
|
||||
|
||||
/**
|
||||
* Load user details by {@link BaseEntity#getLastModifiedBy()} and format
|
||||
* the user name. Use
|
||||
* {@link UserDetailsFormatter#loadAndFormatUsername(String)}
|
||||
*
|
||||
* @param baseEntity
|
||||
* the entity
|
||||
* @return the formatted 'last modefied by user name' (max 100 characters)
|
||||
* cannot be <null>
|
||||
*/
|
||||
public static String loadAndFormatLastModifiedBy(final BaseEntity baseEntity) {
|
||||
if (baseEntity == null || baseEntity.getLastModifiedBy() == null) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
return loadAndFormatUsername(baseEntity.getLastModifiedBy());
|
||||
}
|
||||
|
||||
/**
|
||||
* Load user details by the current session information and format the user
|
||||
* name to max 12 characters. @see
|
||||
* {@link UserDetailsFormatter#loadAndFormatUsername(String, int)}
|
||||
*
|
||||
* @param baseEntity
|
||||
* the entity
|
||||
* @return the formatted user name (max 12 characters) cannot be <null>
|
||||
*/
|
||||
public static String loadAndFormatCurrentUsername() {
|
||||
return loadAndFormatUsername(getCurrentUser().getUsername(), 12);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load user details by the user name and format the user name. If the
|
||||
* loaded {@link UserDetails} is not an instance of a {@link UserPrincipal},
|
||||
* then just the {@link UserDetails#getUsername()} will return.
|
||||
*
|
||||
* If first and last name available, they will combined. Otherwise the
|
||||
* {@link UserPrincipal#getLoginname()} will formatted. The formatted name
|
||||
* is reduced to 100 characters.
|
||||
*
|
||||
* @param username
|
||||
* the user name
|
||||
* @param expectedNameLength
|
||||
* the name size of each name part
|
||||
* @return the formatted user name (max expectedNameLength characters)
|
||||
* cannot be <null>
|
||||
*/
|
||||
public static String loadAndFormatUsername(final String username, final int expectedNameLength) {
|
||||
final UserDetails userDetails = loadUserByUsername(username);
|
||||
if (!(userDetails instanceof UserPrincipal)) {
|
||||
return userDetails.getUsername();
|
||||
}
|
||||
|
||||
final UserPrincipal userPrincipal = (UserPrincipal) userDetails;
|
||||
|
||||
String firstname = StringUtils.defaultIfEmpty(userPrincipal.getFirstname(), StringUtils.EMPTY);
|
||||
|
||||
if (!StringUtils.isEmpty(firstname)) {
|
||||
firstname += DETAIL_SEPERATOR;
|
||||
}
|
||||
|
||||
final String firstAndLastname = firstname
|
||||
+ StringUtils.defaultIfEmpty(userPrincipal.getLastname(), StringUtils.EMPTY);
|
||||
|
||||
final String trimmedUsername = trimAndFormatDetail(firstAndLastname, expectedNameLength);
|
||||
|
||||
if (StringUtils.isEmpty(trimmedUsername)) {
|
||||
return trimAndFormatDetail(userPrincipal.getLoginname(), expectedNameLength);
|
||||
}
|
||||
return firstAndLastname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the current tenant. The information is loaded by the current
|
||||
* session information.
|
||||
*
|
||||
* @return the formatted user name (max 8 characters) can be <null>
|
||||
*/
|
||||
public static String formatCurrentTenant() {
|
||||
final UserDetails userDetails = getCurrentUser();
|
||||
if (!(userDetails instanceof UserPrincipal)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final UserPrincipal userPrincipal = (UserPrincipal) userDetails;
|
||||
return trimAndFormatDetail(userPrincipal.getTenant(), 8);
|
||||
}
|
||||
|
||||
private static UserDetails getCurrentUser() {
|
||||
final SecurityContext context = (SecurityContext) VaadinService.getCurrentRequest().getWrappedSession()
|
||||
.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
|
||||
return (UserDetails) context.getAuthentication().getPrincipal();
|
||||
}
|
||||
|
||||
private static String trimAndFormatDetail(final String formatString, final int expectedDetailLength) {
|
||||
final String detail = StringUtils.defaultIfEmpty(formatString, StringUtils.EMPTY);
|
||||
final String trimmedDetail = StringUtils.substring(detail, 0, expectedDetailLength);
|
||||
if (StringUtils.length(detail) > expectedDetailLength) {
|
||||
return trimmedDetail + TRIM_APPENDIX;
|
||||
}
|
||||
return trimmedDetail;
|
||||
}
|
||||
|
||||
private static UserDetails loadUserByUsername(final String username) {
|
||||
final UserDetailsService userDetailsService = SpringContextHelper.getBean(UserDetailsService.class);
|
||||
try {
|
||||
final UserDetails loadUserByUsername = userDetailsService.loadUserByUsername(username);
|
||||
if (loadUserByUsername == null) {
|
||||
throw new UsernameNotFoundException("User not found " + username);
|
||||
}
|
||||
return loadUserByUsername;
|
||||
} catch (final UsernameNotFoundException e) {
|
||||
return new User(username, "", Collections.emptyList());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -171,9 +171,7 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
|
||||
}
|
||||
|
||||
private Label createHeaderCaption() {
|
||||
final Label captionLabel = SPUIComponentProvider.getLabel(getDefaultCaption(),
|
||||
SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
return captionLabel;
|
||||
return SPUIComponentProvider.getLabel(getDefaultCaption(), SPUILabelDefinitions.SP_WIDGET_CAPTION);
|
||||
}
|
||||
|
||||
protected VerticalLayout getTabLayout() {
|
||||
@@ -213,22 +211,22 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
|
||||
populateDetailsWidget();
|
||||
}
|
||||
|
||||
protected void updateLogLayout(final VerticalLayout changeLogLayout, final Long lastModifiedAt,
|
||||
final String lastModifiedBy, final Long createdAt, final String createdBy, final I18N i18n) {
|
||||
changeLogLayout.removeAllComponents();
|
||||
changeLogLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.created.at"),
|
||||
createdAt == null ? "" : SPDateTimeUtil.getFormattedDate(createdAt)));
|
||||
protected void populateLog() {
|
||||
logLayout.removeAllComponents();
|
||||
|
||||
changeLogLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.created.by"),
|
||||
createdBy == null ? "" : HawkbitCommonUtil.getIMUser(createdBy)));
|
||||
logLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.created.at"),
|
||||
SPDateTimeUtil.formatCreatedAt(selectedBaseEntity)));
|
||||
|
||||
if (null != lastModifiedAt) {
|
||||
changeLogLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.modified.date"),
|
||||
SPDateTimeUtil.getFormattedDate(lastModifiedAt)));
|
||||
logLayout.addComponent(SPUIComponentProvider.createCreatedByLabel(i18n, selectedBaseEntity));
|
||||
|
||||
changeLogLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.modified.by"),
|
||||
lastModifiedBy == null ? "" : HawkbitCommonUtil.getIMUser(lastModifiedBy)));
|
||||
if (selectedBaseEntity == null || selectedBaseEntity.getLastModifiedAt() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
logLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.modified.date"),
|
||||
SPDateTimeUtil.formatLastModifiedAt(selectedBaseEntity)));
|
||||
|
||||
logLayout.addComponent(SPUIComponentProvider.createLastModifiedByLabel(i18n, selectedBaseEntity));
|
||||
}
|
||||
|
||||
protected void updateDescriptionLayout(final String descriptionLabel, final String description) {
|
||||
@@ -320,19 +318,6 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
|
||||
return detailsLayout;
|
||||
}
|
||||
|
||||
public VerticalLayout getLogLayout() {
|
||||
return logLayout;
|
||||
}
|
||||
|
||||
private void populateLog() {
|
||||
if (selectedBaseEntity == null) {
|
||||
updateLogLayout(getLogLayout(), null, StringUtils.EMPTY, null, null, i18n);
|
||||
return;
|
||||
}
|
||||
updateLogLayout(getLogLayout(), selectedBaseEntity.getLastModifiedAt(), selectedBaseEntity.getLastModifiedBy(),
|
||||
selectedBaseEntity.getCreatedAt(), selectedBaseEntity.getCreatedBy(), i18n);
|
||||
}
|
||||
|
||||
private void populateDescription() {
|
||||
if (selectedBaseEntity != null) {
|
||||
updateDescriptionLayout(i18n.get("label.description"), selectedBaseEntity.getDescription());
|
||||
|
||||
@@ -20,7 +20,7 @@ import javax.annotation.PreDestroy;
|
||||
import org.eclipse.hawkbit.repository.model.NamedEntity;
|
||||
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
|
||||
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
@@ -212,9 +212,9 @@ public abstract class AbstractTable<E extends NamedEntity, I> extends Table {
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_ID).setValue(baseEntity.getId());
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_DESC).setValue(baseEntity.getDescription());
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_BY)
|
||||
.setValue(HawkbitCommonUtil.getIMUser(baseEntity.getCreatedBy()));
|
||||
.setValue(UserDetailsFormatter.loadAndFormatCreatedBy(baseEntity));
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY)
|
||||
.setValue(HawkbitCommonUtil.getIMUser(baseEntity.getLastModifiedBy()));
|
||||
.setValue(UserDetailsFormatter.loadAndFormatLastModifiedBy(baseEntity));
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_DATE)
|
||||
.setValue(SPDateTimeUtil.getFormattedDate(baseEntity.getCreatedAt()));
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE)
|
||||
@@ -329,6 +329,17 @@ public abstract class AbstractTable<E extends NamedEntity, I> extends Table {
|
||||
columnList.add(
|
||||
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.1F));
|
||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.2F));
|
||||
setItemDescriptionGenerator((source, itemId, propertyId) -> {
|
||||
|
||||
if (SPUILabelDefinitions.VAR_CREATED_BY.equals(propertyId)) {
|
||||
return getItem(itemId).getItemProperty(SPUILabelDefinitions.VAR_CREATED_BY).getValue().toString();
|
||||
}
|
||||
if (SPUILabelDefinitions.VAR_LAST_MODIFIED_BY.equals(propertyId)) {
|
||||
return getItem(itemId).getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).getValue().toString();
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
return columnList;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.eclipse.hawkbit.repository.model.BaseEntity;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIComboBoxDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIHeaderLayoutDecorator;
|
||||
@@ -20,6 +22,7 @@ import org.eclipse.hawkbit.ui.decorators.SPUILabelDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUITextAreaDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUITextFieldDecorator;
|
||||
import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -328,6 +331,50 @@ public final class SPUIComponentProvider {
|
||||
return nameValueLabel;
|
||||
}
|
||||
|
||||
private static Label createUsernameLabel(final String label, final String username) {
|
||||
String loadAndFormatUsername = StringUtils.EMPTY;
|
||||
if (!StringUtils.isEmpty(username)) {
|
||||
loadAndFormatUsername = UserDetailsFormatter.loadAndFormatUsername(username);
|
||||
}
|
||||
|
||||
final Label nameValueLabel = new Label(getBoldHTMLText(label) + loadAndFormatUsername, ContentMode.HTML);
|
||||
nameValueLabel.setSizeFull();
|
||||
nameValueLabel.addStyleName(SPUIDefinitions.TEXT_STYLE);
|
||||
nameValueLabel.addStyleName("label-style");
|
||||
nameValueLabel.setDescription(loadAndFormatUsername);
|
||||
return nameValueLabel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create label which represents the {@link BaseEntity#getCreatedBy()} by
|
||||
* user name
|
||||
*
|
||||
* @param i18n
|
||||
* the i18n
|
||||
* @param baseEntity
|
||||
* the entity
|
||||
* @return the label
|
||||
*/
|
||||
public static Label createCreatedByLabel(final I18N i18n, final BaseEntity baseEntity) {
|
||||
return createUsernameLabel(i18n.get("label.created.by"),
|
||||
baseEntity == null ? StringUtils.EMPTY : baseEntity.getCreatedBy());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create label which represents the
|
||||
* {@link BaseEntity#getLastModifiedBy()()} by user name
|
||||
*
|
||||
* @param i18n
|
||||
* the i18n
|
||||
* @param baseEntity
|
||||
* the entity
|
||||
* @return the label
|
||||
*/
|
||||
public static Label createLastModifiedByLabel(final I18N i18n, final BaseEntity baseEntity) {
|
||||
return createUsernameLabel(i18n.get("label.modified.by"),
|
||||
baseEntity == null ? StringUtils.EMPTY : baseEntity.getLastModifiedBy());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Bold Text.
|
||||
*
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.customrenderers.client;
|
||||
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
|
||||
|
||||
import com.vaadin.client.connectors.ButtonRendererConnector;
|
||||
import com.vaadin.shared.ui.Connect;
|
||||
|
||||
/**
|
||||
*
|
||||
* A connector for {@link LinkRenderer}.
|
||||
*
|
||||
*/
|
||||
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer.class)
|
||||
public class LinkRendererConnector extends ButtonRendererConnector {
|
||||
private static final long serialVersionUID = 7987417436367399331L;
|
||||
|
||||
@Override
|
||||
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.LinkRenderer getRenderer() {
|
||||
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.LinkRenderer) super.getRenderer();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
|
||||
package org.eclipse.hawkbit.ui.customrenderers.client;
|
||||
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
|
||||
import com.google.web.bindery.event.shared.HandlerRegistration;
|
||||
import com.vaadin.client.connectors.ClickableRendererConnector;
|
||||
import com.vaadin.client.renderers.ClickableRenderer.RendererClickHandler;
|
||||
import com.vaadin.shared.ui.Connect;
|
||||
|
||||
import elemental.json.JsonObject;
|
||||
/**
|
||||
* A connector for {@link CustomObjectRenderer }.
|
||||
*
|
||||
*/
|
||||
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer.class)
|
||||
public class RolloutRendererConnector extends ClickableRendererConnector<RolloutRendererData> {
|
||||
private static final long serialVersionUID = 7734682321931830566L;
|
||||
|
||||
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer getRenderer() {
|
||||
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer) super.getRenderer();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HandlerRegistration addClickHandler(
|
||||
RendererClickHandler<JsonObject> handler) {
|
||||
return getRenderer().addClickHandler(handler);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.customrenderers.client.renderers;
|
||||
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.vaadin.client.renderers.ButtonRenderer;
|
||||
import com.vaadin.client.ui.VButton;
|
||||
import com.vaadin.client.widget.grid.RendererCellReference;
|
||||
|
||||
/**
|
||||
*
|
||||
* Renders link with provided text.
|
||||
*
|
||||
*/
|
||||
public class LinkRenderer extends ButtonRenderer {
|
||||
@Override
|
||||
public void render(RendererCellReference cell, String text, Button button) {
|
||||
button.setText(text);
|
||||
applystyle(button);
|
||||
// this is to allow the button to disappear, if the text is null
|
||||
button.setVisible(text != null);
|
||||
button.getElement().setId(new StringBuilder("link").append(".").append(text).toString());
|
||||
}
|
||||
|
||||
private void applystyle(Button button) {
|
||||
button.setStyleName(VButton.CLASSNAME);
|
||||
button.addStyleName(getStyle("borderless"));
|
||||
button.addStyleName(getStyle("small"));
|
||||
button.addStyleName(getStyle("on-focus-no-border"));
|
||||
button.addStyleName(getStyle("link"));
|
||||
}
|
||||
|
||||
private String getStyle(final String style) {
|
||||
return new StringBuilder(style).append(" ").append(VButton.CLASSNAME).append("-").append(style).toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.customrenderers.client.renderers;
|
||||
|
||||
import com.google.gwt.core.shared.GWT;
|
||||
import com.vaadin.client.renderers.ClickableRenderer;
|
||||
import com.vaadin.client.ui.VButton;
|
||||
import com.vaadin.client.widget.grid.RendererCellReference;
|
||||
|
||||
/**
|
||||
* Renders button with provided CustomObject.
|
||||
* Used to display button with link.
|
||||
*
|
||||
*/
|
||||
public class RolloutRenderer extends ClickableRenderer<RolloutRendererData, VButton> {
|
||||
|
||||
@Override
|
||||
public VButton createWidget() {
|
||||
VButton b = GWT.create(VButton.class);
|
||||
b.addClickHandler(this);
|
||||
b.setStylePrimaryName("v-nativebutton");
|
||||
return b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(RendererCellReference cell, RolloutRendererData text, VButton button) {
|
||||
final String creating = "CREATING";
|
||||
button.setText(text.getName());
|
||||
applystyle(button);
|
||||
// this is to allow the button to disappear, if the text is null
|
||||
button.setVisible(text.getName() != null);
|
||||
button.getElement().setId(new StringBuilder("link").append(".").append(text.getName()).toString());
|
||||
/*
|
||||
* checking Rollout Status for applying button style. If Rollout status
|
||||
* is not "CREATING", then the Rollout button is applying hyperlink
|
||||
* style
|
||||
*/
|
||||
final boolean isStatusCreate = text.getStatus() != null && creating.equalsIgnoreCase(text.getStatus());
|
||||
if (isStatusCreate) {
|
||||
button.addStyleName(getStyle("boldhide"));
|
||||
button.setEnabled(false);
|
||||
} else {
|
||||
button.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void applystyle(VButton button) {
|
||||
button.setStyleName(VButton.CLASSNAME);
|
||||
button.addStyleName(getStyle("borderless"));
|
||||
button.addStyleName(getStyle("small"));
|
||||
button.addStyleName(getStyle("on-focus-no-border"));
|
||||
button.addStyleName(getStyle("link"));
|
||||
}
|
||||
|
||||
private String getStyle(final String style) {
|
||||
return new StringBuilder(style).append(" ").append(VButton.CLASSNAME).append("-").append(style).toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.customrenderers.client.renderers;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* RendererData class with Name and Status.
|
||||
*
|
||||
*/
|
||||
|
||||
public class RolloutRendererData implements Serializable {
|
||||
private static final long serialVersionUID = -5018181529953620263L;
|
||||
|
||||
private String name;
|
||||
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* Initialize the RendererData.
|
||||
*/
|
||||
public RolloutRendererData() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the RendererData.
|
||||
*
|
||||
* @param name
|
||||
* Name of the Rollout.
|
||||
* @param status
|
||||
* Status of Rollout.
|
||||
*/
|
||||
public RolloutRendererData(String name, String status) {
|
||||
super();
|
||||
this.name = name;
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.customrenderers.renderers;
|
||||
|
||||
import com.vaadin.ui.renderers.ButtonRenderer;
|
||||
|
||||
/**
|
||||
*
|
||||
* Renders link with provided text.
|
||||
*
|
||||
*/
|
||||
public class LinkRenderer extends ButtonRenderer {
|
||||
private static final long serialVersionUID = -1242995370043404892L;
|
||||
|
||||
/**
|
||||
* Intialise link renderer.
|
||||
*/
|
||||
public LinkRenderer() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Intialise link renderer with {@link RendererClickListener}
|
||||
*
|
||||
* @param listener
|
||||
* RendererClickListener
|
||||
*/
|
||||
public LinkRenderer(RendererClickListener listener) {
|
||||
super(listener);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*/
|
||||
|
||||
package org.eclipse.hawkbit.ui.customrenderers.renderers;
|
||||
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
|
||||
import com.vaadin.ui.renderers.ClickableRenderer;
|
||||
|
||||
import elemental.json.JsonValue;
|
||||
|
||||
/**
|
||||
* Renders button with provided CustomObject.
|
||||
* Used to display button with link.
|
||||
*
|
||||
*/
|
||||
|
||||
public class RolloutRenderer extends ClickableRenderer<RolloutRendererData> {
|
||||
|
||||
private static final long serialVersionUID = -8754180585906263554L;
|
||||
|
||||
/**
|
||||
* Creates a new custom object renderer.
|
||||
*/
|
||||
public RolloutRenderer() {
|
||||
super(RolloutRendererData.class, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize custom object renderer with {@link Class<CustomObject>}
|
||||
*
|
||||
* @param presentationType
|
||||
* Class<CustomObject>
|
||||
*/
|
||||
|
||||
public RolloutRenderer(Class<RolloutRendererData> presentationType) {
|
||||
super(presentationType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new custom object renderer and adds the given click listener to it.
|
||||
*
|
||||
* @param listener
|
||||
* the click listener to register
|
||||
*/
|
||||
public RolloutRenderer(RendererClickListener listener) {
|
||||
this();
|
||||
addClickListener(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonValue encode(RolloutRendererData resource) {
|
||||
return super.encode(resource, RolloutRendererData.class);
|
||||
}
|
||||
}
|
||||
@@ -299,6 +299,7 @@ public class CreateUpdateDistSetTypeLayout extends CustomComponent implements Co
|
||||
mainWindowLayout.addComponent(colorLayout);
|
||||
mainWindowLayout.addComponent(buttonLayout);
|
||||
setCompositionRoot(mainWindowLayout);
|
||||
typeName.focus();
|
||||
}
|
||||
|
||||
private HorizontalLayout createTwinColumnLayout() {
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.eclipse.hawkbit.repository.DistributionSetManagement;
|
||||
import org.eclipse.hawkbit.repository.OffsetBasedPageRequest;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSetType;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.ProxyDistribution;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
@@ -113,8 +114,8 @@ public class ManageDistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
|
||||
proxyDistribution.setCreatedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getCreatedAt()));
|
||||
proxyDistribution.setLastModifiedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getLastModifiedAt()));
|
||||
proxyDistribution.setDescription(distributionSet.getDescription());
|
||||
proxyDistribution.setCreatedByUser(HawkbitCommonUtil.getIMUser(distributionSet.getCreatedBy()));
|
||||
proxyDistribution.setModifiedByUser(HawkbitCommonUtil.getIMUser(distributionSet.getLastModifiedBy()));
|
||||
proxyDistribution.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(distributionSet));
|
||||
proxyDistribution.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(distributionSet));
|
||||
proxyDistribution.setIsComplete(distributionSet.isComplete());
|
||||
proxyDistributions.add(proxyDistribution);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.eclipse.hawkbit.repository.SoftwareManagement;
|
||||
import org.eclipse.hawkbit.repository.model.CustomSoftwareModule;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||
import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||
@@ -99,8 +100,8 @@ public class SwModuleBeanQuery extends AbstractBeanQuery<ProxyBaseSwModuleItem>
|
||||
proxyItem.setVersion(bean.getVersion());
|
||||
proxyItem.setVendor(bean.getVendor());
|
||||
proxyItem.setDescription(bean.getDescription());
|
||||
proxyItem.setCreatedByUser(HawkbitCommonUtil.getIMUser(bean.getCreatedBy()));
|
||||
proxyItem.setModifiedByUser(HawkbitCommonUtil.getIMUser(bean.getLastModifiedBy()));
|
||||
proxyItem.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(bean));
|
||||
proxyItem.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(bean));
|
||||
proxyItem.setAssigned(customSoftwareModule.isAssigned());
|
||||
proxyItem.setColour(bean.getType().getColour());
|
||||
proxyItem.setTypeId(bean.getType().getId());
|
||||
|
||||
@@ -15,6 +15,7 @@ import java.util.Map;
|
||||
import org.eclipse.hawkbit.repository.TargetManagement;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.ProxyTarget;
|
||||
import org.eclipse.hawkbit.ui.filtermanagement.state.FilterManagementUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
@@ -118,8 +119,8 @@ public class CustomTargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
prxyTarget.setLastModifiedDate(SPDateTimeUtil.getFormattedDate(targ.getLastModifiedAt()));
|
||||
prxyTarget.setCreatedDate(SPDateTimeUtil.getFormattedDate(targ.getCreatedAt()));
|
||||
prxyTarget.setCreatedAt(targ.getCreatedAt());
|
||||
prxyTarget.setCreatedByUser(HawkbitCommonUtil.getIMUser(targ.getCreatedBy()));
|
||||
prxyTarget.setModifiedByUser(HawkbitCommonUtil.getIMUser(targ.getLastModifiedBy()));
|
||||
prxyTarget.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(targ));
|
||||
prxyTarget.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(targ));
|
||||
final Target target = getTargetManagement().findTargetByControllerIDWithDetails(targ.getControllerId());
|
||||
final DistributionSet installedDistributionSet = target.getTargetInfo().getInstalledDistributionSet();
|
||||
prxyTarget.setInstalledDistributionSet(installedDistributionSet);
|
||||
|
||||
@@ -14,6 +14,7 @@ import java.util.Map;
|
||||
|
||||
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
|
||||
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.ProxyTargetFilter;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
@@ -93,9 +94,9 @@ public class TargetFilterBeanQuery extends AbstractBeanQuery<ProxyTargetFilter>
|
||||
proxyTarFilter.setName(tarFilterQuery.getName());
|
||||
proxyTarFilter.setId(tarFilterQuery.getId());
|
||||
proxyTarFilter.setCreatedDate(SPDateTimeUtil.getFormattedDate(tarFilterQuery.getCreatedAt()));
|
||||
proxyTarFilter.setCreatedBy(HawkbitCommonUtil.getIMUser(tarFilterQuery.getCreatedBy()));
|
||||
proxyTarFilter.setCreatedBy(UserDetailsFormatter.loadAndFormatCreatedBy(tarFilterQuery));
|
||||
proxyTarFilter.setModifiedDate(SPDateTimeUtil.getFormattedDate(tarFilterQuery.getLastModifiedAt()));
|
||||
proxyTarFilter.setLastModifiedBy(HawkbitCommonUtil.getIMUser(tarFilterQuery.getLastModifiedBy()));
|
||||
proxyTarFilter.setLastModifiedBy(UserDetailsFormatter.loadAndFormatLastModifiedBy(tarFilterQuery));
|
||||
proxyTarFilter.setQuery(tarFilterQuery.getQuery());
|
||||
proxyTargetFilter.add(proxyTarFilter);
|
||||
}
|
||||
|
||||
@@ -148,6 +148,7 @@ public class DistributionAddUpdateWindowLayout extends VerticalLayout {
|
||||
|
||||
addComponent(buttonsLayout);
|
||||
setComponentAlignment(madatoryLabel, Alignment.MIDDLE_LEFT);
|
||||
distNameTextField.focus();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.eclipse.hawkbit.repository.DistributionSetFilter.DistributionSetFilte
|
||||
import org.eclipse.hawkbit.repository.DistributionSetManagement;
|
||||
import org.eclipse.hawkbit.repository.OffsetBasedPageRequest;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.ProxyDistribution;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
@@ -129,8 +130,8 @@ public class DistributionBeanQuery extends AbstractBeanQuery<ProxyDistribution>
|
||||
proxyDistribution.setCreatedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getCreatedAt()));
|
||||
proxyDistribution.setLastModifiedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getLastModifiedAt()));
|
||||
proxyDistribution.setDescription(distributionSet.getDescription());
|
||||
proxyDistribution.setCreatedByUser(HawkbitCommonUtil.getIMUser(distributionSet.getCreatedBy()));
|
||||
proxyDistribution.setModifiedByUser(HawkbitCommonUtil.getIMUser(distributionSet.getLastModifiedBy()));
|
||||
proxyDistribution.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(distributionSet));
|
||||
proxyDistribution.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(distributionSet));
|
||||
proxyDistribution.setNameVersion(
|
||||
HawkbitCommonUtil.getFormattedNameVersion(distributionSet.getName(), distributionSet.getVersion()));
|
||||
proxyDistributions.add(proxyDistribution);
|
||||
|
||||
@@ -238,6 +238,7 @@ public abstract class CreateUpdateTagLayout extends CustomComponent implements C
|
||||
fieldLayout.addComponent(tagName);
|
||||
fieldLayout.addComponent(tagDesc);
|
||||
|
||||
|
||||
final HorizontalLayout colorLabelLayout = new HorizontalLayout();
|
||||
colorLabelLayout.addComponents(colorLabel, tagColorPreviewBtn);
|
||||
fieldLayout.addComponent(colorLabelLayout);
|
||||
@@ -257,8 +258,8 @@ public abstract class CreateUpdateTagLayout extends CustomComponent implements C
|
||||
|
||||
mainLayout = new HorizontalLayout();
|
||||
mainLayout.addComponent(fieldButtonLayout);
|
||||
|
||||
setCompositionRoot(mainLayout);
|
||||
tagName.focus();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ public class TargetAddUpdateWindowLayout extends CustomComponent {
|
||||
madatoryLabel.setVisible(Boolean.FALSE);
|
||||
}
|
||||
mainLayout.addComponents(madatoryLabel, controllerIDTextField, nameTextField, descTextArea, buttonsLayout);
|
||||
|
||||
nameTextField.focus();
|
||||
}
|
||||
|
||||
private void addListeners() {
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
|
||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.ProxyTarget;
|
||||
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
@@ -130,8 +131,8 @@ public class TargetBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||
prxyTarget.setLastModifiedDate(SPDateTimeUtil.getFormattedDate(targ.getLastModifiedAt()));
|
||||
prxyTarget.setCreatedDate(SPDateTimeUtil.getFormattedDate(targ.getCreatedAt()));
|
||||
prxyTarget.setCreatedAt(targ.getCreatedAt());
|
||||
prxyTarget.setCreatedByUser(HawkbitCommonUtil.getIMUser(targ.getCreatedBy()));
|
||||
prxyTarget.setModifiedByUser(HawkbitCommonUtil.getIMUser(targ.getLastModifiedBy()));
|
||||
prxyTarget.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(targ));
|
||||
prxyTarget.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(targ));
|
||||
|
||||
if (pinnedDistId == null) {
|
||||
prxyTarget.setInstalledDistributionSet(null);
|
||||
|
||||
@@ -32,6 +32,7 @@ import org.eclipse.hawkbit.repository.model.TargetInfo;
|
||||
import org.eclipse.hawkbit.repository.model.TargetTagAssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
||||
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.filter.FilterExpression;
|
||||
@@ -739,7 +740,7 @@ public class TargetTable extends AbstractTable<Target, TargetIdName> implements
|
||||
.setValue(updatedTarget.getTargetInfo().getLastTargetQuery());
|
||||
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY)
|
||||
.setValue(HawkbitCommonUtil.getIMUser(updatedTarget.getLastModifiedBy()));
|
||||
.setValue(UserDetailsFormatter.loadAndFormatLastModifiedBy(updatedTarget));
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE)
|
||||
.setValue(SPDateTimeUtil.getFormattedDate(updatedTarget.getLastModifiedAt()));
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_DESC).setValue(updatedTarget.getDescription());
|
||||
|
||||
@@ -18,23 +18,20 @@ import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.eclipse.hawkbit.HawkbitServerProperties;
|
||||
import org.eclipse.hawkbit.im.authentication.PermissionService;
|
||||
import org.eclipse.hawkbit.im.authentication.UserPrincipal;
|
||||
import org.eclipse.hawkbit.ui.UiProperties;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.menu.DashboardEvent.PostViewChangeEvent;
|
||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.core.context.SecurityContext;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
|
||||
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.server.Page;
|
||||
import com.vaadin.server.ThemeResource;
|
||||
import com.vaadin.server.VaadinService;
|
||||
import com.vaadin.shared.ui.label.ContentMode;
|
||||
import com.vaadin.spring.annotation.SpringComponent;
|
||||
import com.vaadin.spring.annotation.UIScope;
|
||||
@@ -189,63 +186,27 @@ public final class DashboardMenu extends CustomComponent {
|
||||
return links;
|
||||
}
|
||||
|
||||
private UserDetails getCurrentUser() {
|
||||
final SecurityContext context = (SecurityContext) VaadinService.getCurrentRequest().getWrappedSession()
|
||||
.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
|
||||
return (UserDetails) context.getAuthentication().getPrincipal();
|
||||
}
|
||||
|
||||
private Component buildUserMenu() {
|
||||
final MenuBar settings = new MenuBar();
|
||||
settings.addStyleName("user-menu");
|
||||
final UserDetails user = getCurrentUser();
|
||||
settings.setHtmlContentAllowed(true);
|
||||
final MenuItem settingsItem = settings.addItem("", new ThemeResource("images/profile-pic-57px.jpg"), null);
|
||||
if (user instanceof UserPrincipal
|
||||
&& (((UserPrincipal) user).getFirstname() != null || ((UserPrincipal) user).getLastname() != null)) {
|
||||
settingsItem.setText(trimTanent(((UserPrincipal) user).getTenant()) + "\n"
|
||||
+ concateFNameLName(((UserPrincipal) user).getFirstname(), ((UserPrincipal) user).getLastname()));
|
||||
settingsItem.setDescription(
|
||||
((UserPrincipal) user).getFirstname() + " / " + ((UserPrincipal) user).getLastname());
|
||||
} else if (user instanceof UserPrincipal) {
|
||||
if (((UserPrincipal) user).getLoginname().length() > 10) {
|
||||
settingsItem.setText(trimTanent(((UserPrincipal) user).getTenant()) + "\n"
|
||||
+ ((UserPrincipal) user).getLoginname().substring(0, 10) + "..");
|
||||
} else {
|
||||
settingsItem.setText(
|
||||
trimTanent(((UserPrincipal) user).getTenant()) + "\n" + ((UserPrincipal) user).getLoginname());
|
||||
}
|
||||
settingsItem.setDescription(((UserPrincipal) user).getLoginname());
|
||||
} else if (user != null) {
|
||||
settingsItem.setText(user.getUsername());
|
||||
settingsItem.setDescription(user.getUsername());
|
||||
|
||||
final String formattedTenant = UserDetailsFormatter.formatCurrentTenant();
|
||||
final String formattedUsername = UserDetailsFormatter.loadAndFormatCurrentUsername();
|
||||
String tenantAndUsernameHtml = "";
|
||||
if (!StringUtils.isEmpty(formattedTenant)) {
|
||||
tenantAndUsernameHtml += formattedTenant + "<br>";
|
||||
}
|
||||
tenantAndUsernameHtml += formattedUsername;
|
||||
settingsItem.setText(tenantAndUsernameHtml);
|
||||
settingsItem.setDescription(formattedUsername);
|
||||
settingsItem.setStyleName("user-menuitem");
|
||||
|
||||
settingsItem.addItem("Sign Out", selectedItem -> Page.getCurrent().setLocation("/UI/logout"));
|
||||
return settings;
|
||||
}
|
||||
|
||||
private String concateFNameLName(final String fName, final String lName) {
|
||||
final StringBuilder userName = new StringBuilder();
|
||||
if (fName != null && fName.length() > 6) {
|
||||
userName.append(fName.substring(0, 6) + ".." + ", ");
|
||||
} else {
|
||||
userName.append(fName).append(", ");
|
||||
}
|
||||
if (lName != null && lName.length() > 6) {
|
||||
userName.append(lName.substring(0, 6) + "..");
|
||||
} else {
|
||||
userName.append(lName);
|
||||
}
|
||||
return userName.toString();
|
||||
}
|
||||
|
||||
private String trimTanent(final String tanent) {
|
||||
if (tanent != null && tanent.length() > 8) {
|
||||
return tanent.substring(0, 8) + "..";
|
||||
}
|
||||
return tanent;
|
||||
}
|
||||
|
||||
private Component buildToggleButton() {
|
||||
final Button valoMenuToggleButton = new Button("Menu", (ClickListener) event -> {
|
||||
if (getCompositionRoot().getStyleName().contains(STYLE_VISIBLE)) {
|
||||
|
||||
@@ -209,6 +209,7 @@ public class AddUpdateRolloutWindowLayout extends CustomComponent {
|
||||
actionTypeOptionGroupLayout, linkToHelp, getSaveDiscardButtonLayout());
|
||||
mainLayout.setComponentAlignment(linkToHelp, Alignment.BOTTOM_RIGHT);
|
||||
setCompositionRoot(mainLayout);
|
||||
rolloutName.focus();
|
||||
}
|
||||
|
||||
private HorizontalLayout getGroupDetailsLayout() {
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.eclipse.hawkbit.repository.DistributionSetFilter;
|
||||
import org.eclipse.hawkbit.repository.DistributionSetFilter.DistributionSetFilterBuilder;
|
||||
import org.eclipse.hawkbit.repository.DistributionSetManagement;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.ProxyDistribution;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
@@ -62,7 +63,8 @@ public class DistributionBeanQuery extends AbstractBeanQuery<ProxyDistribution>
|
||||
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortPropertyIds[0]);
|
||||
// Add sort
|
||||
for (int distId = 1; distId < sortPropertyIds.length; distId++) {
|
||||
sort.and(new Sort(sortStates[distId] ? Direction.ASC : Direction.DESC, (String) sortPropertyIds[distId]));
|
||||
sort.and(new Sort(sortStates[distId] ? Direction.ASC : Direction.DESC,
|
||||
(String) sortPropertyIds[distId]));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,8 +105,8 @@ public class DistributionBeanQuery extends AbstractBeanQuery<ProxyDistribution>
|
||||
final List<ProxyDistribution> proxyDistributions = new ArrayList<>();
|
||||
for (final DistributionSet distributionSet : distBeans) {
|
||||
final ProxyDistribution proxyDistribution = new ProxyDistribution();
|
||||
proxyDistribution.setName(HawkbitCommonUtil.getFormattedNameVersion(distributionSet.getName(),
|
||||
distributionSet.getVersion()));
|
||||
proxyDistribution.setName(
|
||||
HawkbitCommonUtil.getFormattedNameVersion(distributionSet.getName(), distributionSet.getVersion()));
|
||||
proxyDistribution.setDescription(distributionSet.getDescription());
|
||||
proxyDistribution.setDistId(distributionSet.getId());
|
||||
proxyDistribution.setId(distributionSet.getId());
|
||||
@@ -112,8 +114,8 @@ public class DistributionBeanQuery extends AbstractBeanQuery<ProxyDistribution>
|
||||
proxyDistribution.setCreatedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getCreatedAt()));
|
||||
proxyDistribution.setLastModifiedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getLastModifiedAt()));
|
||||
proxyDistribution.setDescription(distributionSet.getDescription());
|
||||
proxyDistribution.setCreatedByUser(HawkbitCommonUtil.getIMUser(distributionSet.getCreatedBy()));
|
||||
proxyDistribution.setModifiedByUser(HawkbitCommonUtil.getIMUser(distributionSet.getLastModifiedBy()));
|
||||
proxyDistribution.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(distributionSet));
|
||||
proxyDistribution.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(distributionSet));
|
||||
proxyDistribution.setIsComplete(distributionSet.isComplete());
|
||||
proxyDistributions.add(proxyDistribution);
|
||||
}
|
||||
|
||||
@@ -9,11 +9,12 @@
|
||||
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||
|
||||
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
|
||||
import com.vaadin.server.FontAwesome;
|
||||
|
||||
/**
|
||||
* Proxy rollout with suctome properties.
|
||||
* Proxy rollout with custom properties.
|
||||
*
|
||||
*/
|
||||
public class ProxyRollout extends Rollout {
|
||||
@@ -32,6 +33,17 @@ public class ProxyRollout extends Rollout {
|
||||
|
||||
private String totalTargetsCount;
|
||||
|
||||
private RolloutRendererData rolloutRendererData;
|
||||
|
||||
|
||||
public RolloutRendererData getRolloutRendererData() {
|
||||
return rolloutRendererData;
|
||||
}
|
||||
|
||||
public void setRolloutRendererData(RolloutRendererData rendererData) {
|
||||
this.rolloutRendererData = rendererData;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the distributionSetNameVersion
|
||||
*/
|
||||
@@ -122,7 +134,6 @@ public class ProxyRollout extends Rollout {
|
||||
this.totalTargetsCount = totalTargetsCount;
|
||||
}
|
||||
|
||||
|
||||
public String getAction() {
|
||||
return FontAwesome.CIRCLE_O.getHtml();
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
@@ -119,17 +121,19 @@ public class RolloutBeanQuery extends AbstractBeanQuery<ProxyRollout> {
|
||||
proxyRollout.setName(rollout.getName());
|
||||
proxyRollout.setDescription(rollout.getDescription());
|
||||
final DistributionSet distributionSet = rollout.getDistributionSet();
|
||||
proxyRollout.setDistributionSetNameVersion(HawkbitCommonUtil.getFormattedNameVersion(
|
||||
distributionSet.getName(), distributionSet.getVersion()));
|
||||
proxyRollout.setDistributionSetNameVersion(
|
||||
HawkbitCommonUtil.getFormattedNameVersion(distributionSet.getName(), distributionSet.getVersion()));
|
||||
proxyRollout.setDistributionSet(distributionSet);
|
||||
proxyRollout.setNumberOfGroups(Long.valueOf(rollout.getRolloutGroups().size()));
|
||||
proxyRollout.setCreatedDate(SPDateTimeUtil.getFormattedDate(rollout.getCreatedAt()));
|
||||
proxyRollout.setModifiedDate(SPDateTimeUtil.getFormattedDate(rollout.getLastModifiedAt()));
|
||||
proxyRollout.setCreatedBy(HawkbitCommonUtil.getIMUser(rollout.getCreatedBy()));
|
||||
proxyRollout.setLastModifiedBy(HawkbitCommonUtil.getIMUser(rollout.getLastModifiedBy()));
|
||||
proxyRollout.setCreatedBy(UserDetailsFormatter.loadAndFormatCreatedBy(rollout));
|
||||
proxyRollout.setLastModifiedBy(UserDetailsFormatter.loadAndFormatLastModifiedBy(rollout));
|
||||
proxyRollout.setForcedTime(rollout.getForcedTime());
|
||||
proxyRollout.setId(rollout.getId());
|
||||
proxyRollout.setStatus(rollout.getStatus());
|
||||
proxyRollout
|
||||
.setRolloutRendererData(new RolloutRendererData(rollout.getName(), rollout.getStatus().toString()));
|
||||
|
||||
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
|
||||
proxyRollout.setTotalTargetCountStatus(totalTargetCountActionStatus);
|
||||
@@ -148,7 +152,8 @@ public class RolloutBeanQuery extends AbstractBeanQuery<ProxyRollout> {
|
||||
* .util.List, java.util.List, java.util.List)
|
||||
*/
|
||||
@Override
|
||||
protected void saveBeans(final List<ProxyRollout> arg0, final List<ProxyRollout> arg1, final List<ProxyRollout> arg2) {
|
||||
protected void saveBeans(final List<ProxyRollout> arg0, final List<ProxyRollout> arg1,
|
||||
final List<ProxyRollout> arg2) {
|
||||
/**
|
||||
* CRUD operations on Target will be done through repository methods
|
||||
*/
|
||||
|
||||
@@ -22,9 +22,10 @@ import org.eclipse.hawkbit.repository.model.Rollout;
|
||||
import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;
|
||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer;
|
||||
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
|
||||
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
|
||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||
@@ -77,6 +78,7 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
|
||||
private static final String START_OPTION = "Start";
|
||||
|
||||
private static final String ROLLOUT_RENDERER_DATA = "rolloutRendererData";
|
||||
|
||||
@Autowired
|
||||
private transient RolloutManagement rolloutManagement;
|
||||
@@ -95,7 +97,10 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
|
||||
private transient Map<RolloutStatus, StatusFontIcon> statusIconMap = new EnumMap<>(RolloutStatus.class);
|
||||
|
||||
|
||||
/**
|
||||
* Handles the RolloutEvent to refresh Grid.
|
||||
*
|
||||
*/
|
||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||
void onEvent(final RolloutEvent event) {
|
||||
switch (event) {
|
||||
@@ -132,10 +137,16 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rollout.getStatus());
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setValue(totalTargetCountStatus);
|
||||
final Long groupCount = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).getValue();
|
||||
if (rollout.getRolloutGroups() != null && groupCount != rollout.getRolloutGroups().size()) {
|
||||
final int groupsCreated = rollout.getRolloutGroupsCreated();
|
||||
if (groupsCreated != 0) {
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setValue(Long.valueOf(groupsCreated));
|
||||
} else if (rollout.getRolloutGroups() != null && groupCount != rollout.getRolloutGroups().size()) {
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS)
|
||||
.setValue(Long.valueOf(rollout.getRolloutGroups().size()));
|
||||
}
|
||||
item.getItemProperty(ROLLOUT_RENDERER_DATA)
|
||||
.setValue(new RolloutRendererData(rollout.getName(), rollout.getStatus().toString()));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -149,6 +160,7 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
protected void addContainerProperties() {
|
||||
final LazyQueryContainer rolloutGridContainer = (LazyQueryContainer) getContainerDataSource();
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
|
||||
rolloutGridContainer.addContainerProperty(ROLLOUT_RENDERER_DATA, RolloutRendererData.class, null, false, false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false,
|
||||
false);
|
||||
@@ -163,7 +175,7 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
|
||||
false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Integer.class, 0, false,
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Long.class, 0, false,
|
||||
false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
|
||||
false);
|
||||
@@ -177,8 +189,9 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
|
||||
@Override
|
||||
protected void setColumnExpandRatio() {
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(150);
|
||||
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setMinimumWidth(40);
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setMaximumWidth(150);
|
||||
|
||||
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMinimumWidth(40);
|
||||
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(150);
|
||||
@@ -202,7 +215,7 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
|
||||
@Override
|
||||
protected void setColumnHeaderNames() {
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setHeaderCaption(i18n.get("header.name"));
|
||||
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setHeaderCaption(i18n.get("header.distributionset"));
|
||||
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setHeaderCaption(i18n.get("header.numberofgroups"));
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.get("header.total.targets"));
|
||||
@@ -225,7 +238,7 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
@Override
|
||||
protected void setColumnProperties() {
|
||||
final List<Object> columnList = new ArrayList<>();
|
||||
columnList.add(SPUILabelDefinitions.VAR_NAME);
|
||||
columnList.add(ROLLOUT_RENDERER_DATA);
|
||||
columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION);
|
||||
columnList.add(SPUILabelDefinitions.VAR_STATUS);
|
||||
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
|
||||
@@ -245,6 +258,7 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
@Override
|
||||
protected void setHiddenColumns() {
|
||||
final List<Object> columnsToBeHidden = new ArrayList<>();
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_NAME);
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
|
||||
@@ -263,6 +277,8 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
|
||||
@Override
|
||||
protected void addColumnRenderes() {
|
||||
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setRenderer(new HtmlRenderer(),
|
||||
new TotalTargetGroupsConverter());
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
|
||||
new TotalTargetCountStatusConverter());
|
||||
|
||||
@@ -270,7 +286,11 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new RolloutStatusConverter());
|
||||
|
||||
getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(event -> onClickOfActionBtn(event)));
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME).setRenderer(new LinkRenderer(event -> onClickOfRolloutName(event)));
|
||||
|
||||
final RolloutRenderer customObjectRenderer = new RolloutRenderer(RolloutRendererData.class);
|
||||
customObjectRenderer.addClickListener(event -> onClickOfRolloutName(event));
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setRenderer(customObjectRenderer);
|
||||
|
||||
}
|
||||
|
||||
private void createRolloutStatusToFontMap() {
|
||||
@@ -403,6 +423,9 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
((LazyQueryContainer) getContainerDataSource()).refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generator to generate fontIcon by String.
|
||||
*/
|
||||
public final class FontIconGenerator extends PropertyValueGenerator<String> {
|
||||
|
||||
private static final long serialVersionUID = 2544026030795375748L;
|
||||
@@ -428,8 +451,8 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
return cell.getProperty().getValue().toString().toLowerCase();
|
||||
} else if (SPUILabelDefinitions.ACTION.equals(cell.getPropertyId())) {
|
||||
return SPUILabelDefinitions.ACTION.toLowerCase();
|
||||
} else if (SPUILabelDefinitions.VAR_NAME.equals(cell.getPropertyId())) {
|
||||
return cell.getProperty().getValue().toString();
|
||||
} else if (ROLLOUT_RENDERER_DATA.equals(cell.getPropertyId())) {
|
||||
return ((RolloutRendererData) cell.getProperty().getValue()).getName();
|
||||
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
|
||||
return DistributionBarHelper
|
||||
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
|
||||
@@ -568,4 +591,39 @@ public class RolloutListGrid extends AbstractGrid {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converter to convert 0 to empty, if total target groups is zero.
|
||||
*
|
||||
*/
|
||||
class TotalTargetGroupsConverter implements Converter<String, Long> {
|
||||
|
||||
private static final long serialVersionUID = 6589305227035220369L;
|
||||
|
||||
@Override
|
||||
public Long convertToModel(final String value, final Class<? extends Long> targetType, final Locale locale)
|
||||
throws com.vaadin.data.util.converter.Converter.ConversionException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String convertToPresentation(final Long value, final Class<? extends String> targetType,
|
||||
final Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException {
|
||||
if (value == 0) {
|
||||
return "";
|
||||
}
|
||||
return value.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<Long> getModelType() {
|
||||
return Long.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<String> getPresentationType() {
|
||||
return String.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
|
||||
|
||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
|
||||
/**
|
||||
* Proxy rollout group with suctome properties.
|
||||
* Proxy rollout group with renderer properties.
|
||||
*
|
||||
*/
|
||||
public class ProxyRolloutGroup extends RolloutGroup {
|
||||
@@ -40,6 +41,16 @@ public class ProxyRolloutGroup extends RolloutGroup {
|
||||
|
||||
private String totalTargetsCount;
|
||||
|
||||
private RolloutRendererData rolloutRendererData;
|
||||
|
||||
public RolloutRendererData getRolloutRendererData() {
|
||||
return rolloutRendererData;
|
||||
}
|
||||
|
||||
public void setRolloutRendererData(RolloutRendererData rendererData) {
|
||||
this.rolloutRendererData = rendererData;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the createdDate
|
||||
*/
|
||||
|
||||
@@ -15,6 +15,8 @@ import java.util.Map;
|
||||
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
|
||||
import org.eclipse.hawkbit.repository.RolloutManagement;
|
||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||
@@ -110,8 +112,8 @@ public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup>
|
||||
proxyRolloutGroup.setDescription(rolloutGroup.getDescription());
|
||||
proxyRolloutGroup.setCreatedDate(SPDateTimeUtil.getFormattedDate(rolloutGroup.getCreatedAt()));
|
||||
proxyRolloutGroup.setModifiedDate(SPDateTimeUtil.getFormattedDate(rolloutGroup.getLastModifiedAt()));
|
||||
proxyRolloutGroup.setCreatedBy(HawkbitCommonUtil.getIMUser(rolloutGroup.getCreatedBy()));
|
||||
proxyRolloutGroup.setLastModifiedBy(HawkbitCommonUtil.getIMUser(rolloutGroup.getLastModifiedBy()));
|
||||
proxyRolloutGroup.setCreatedBy(UserDetailsFormatter.loadAndFormatCreatedBy(rolloutGroup));
|
||||
proxyRolloutGroup.setLastModifiedBy(UserDetailsFormatter.loadAndFormatLastModifiedBy(rolloutGroup));
|
||||
proxyRolloutGroup.setId(rolloutGroup.getId());
|
||||
proxyRolloutGroup.setStatus(rolloutGroup.getStatus());
|
||||
proxyRolloutGroup.setErrorAction(rolloutGroup.getErrorAction());
|
||||
@@ -122,6 +124,8 @@ public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup>
|
||||
proxyRolloutGroup.setSuccessConditionExp(rolloutGroup.getSuccessConditionExp());
|
||||
proxyRolloutGroup.setFinishedPercentage(calculateFinishedPercentage(rolloutGroup));
|
||||
|
||||
proxyRolloutGroup.setRolloutRendererData(new RolloutRendererData(rolloutGroup.getName(), null));
|
||||
|
||||
proxyRolloutGroup.setTotalTargetsCount(String.valueOf(rolloutGroup.getTotalTargets()));
|
||||
proxyRolloutGroup.setTotalTargetCountStatus(rolloutGroup.getTotalTargetCountStatus());
|
||||
|
||||
|
||||
@@ -17,13 +17,15 @@ import java.util.Map;
|
||||
|
||||
import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent;
|
||||
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
|
||||
import org.eclipse.hawkbit.repository.RolloutManagement;
|
||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
|
||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer;
|
||||
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
|
||||
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
|
||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||
@@ -59,9 +61,14 @@ import com.vaadin.ui.renderers.HtmlRenderer;
|
||||
public class RolloutGroupListGrid extends AbstractGrid {
|
||||
private static final long serialVersionUID = 4060904914954370524L;
|
||||
|
||||
private static final String ROLLOUT_RENDERER_DATA = "rolloutRendererData";
|
||||
|
||||
@Autowired
|
||||
private transient RolloutGroupManagement rolloutGroupManagement;
|
||||
|
||||
@Autowired
|
||||
private transient RolloutManagement rolloutManagement;
|
||||
|
||||
@Autowired
|
||||
private transient RolloutUIState rolloutUIState;
|
||||
|
||||
@@ -103,6 +110,13 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rolloutGroup.getStatus());
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
|
||||
.setValue(rolloutGroup.getTotalTargetCountStatus());
|
||||
item.getItemProperty(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE)
|
||||
.setValue(calculateFinishedPercentage(rolloutGroup));
|
||||
}
|
||||
|
||||
private String calculateFinishedPercentage(final RolloutGroup rolloutGroup) {
|
||||
return HawkbitCommonUtil.formattingFinishedPercentage(rolloutGroup,
|
||||
rolloutManagement.getFinishedPercentForRunningGroup(rolloutGroup.getRollout().getId(), rolloutGroup));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -116,6 +130,9 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
||||
protected void addContainerProperties() {
|
||||
final LazyQueryContainer rolloutGroupGridContainer = (LazyQueryContainer) getContainerDataSource();
|
||||
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
|
||||
|
||||
rolloutGroupGridContainer.addContainerProperty(ROLLOUT_RENDERER_DATA, RolloutRendererData.class, null, false,
|
||||
false);
|
||||
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
|
||||
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutGroupStatus.class, null,
|
||||
false, false);
|
||||
@@ -145,8 +162,8 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
||||
|
||||
@Override
|
||||
protected void setColumnExpandRatio() {
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(200);
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setMinimumWidth(40);
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setMaximumWidth(200);
|
||||
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(40);
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMaximumWidth(100);
|
||||
@@ -170,7 +187,7 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
||||
|
||||
@Override
|
||||
protected void setColumnHeaderNames() {
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setHeaderCaption(i18n.get("header.name"));
|
||||
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
|
||||
.setHeaderCaption(i18n.get("header.detail.status"));
|
||||
@@ -196,7 +213,7 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
||||
@Override
|
||||
protected void setColumnProperties() {
|
||||
final List<Object> columnList = new ArrayList<>();
|
||||
columnList.add(SPUILabelDefinitions.VAR_NAME);
|
||||
columnList.add(ROLLOUT_RENDERER_DATA);
|
||||
columnList.add(SPUILabelDefinitions.VAR_STATUS);
|
||||
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
|
||||
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
|
||||
@@ -221,14 +238,15 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
|
||||
new TotalTargetCountStatusConverter());
|
||||
if (permissionChecker.hasRolloutTargetsReadPermission()) {
|
||||
getColumn(SPUILabelDefinitions.VAR_NAME)
|
||||
.setRenderer(new LinkRenderer(event -> onClickOfRolloutGroupName(event)));
|
||||
getColumn(ROLLOUT_RENDERER_DATA)
|
||||
.setRenderer(new RolloutRenderer(event -> onClickOfRolloutGroupName(event)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setHiddenColumns() {
|
||||
final List<Object> columnsToBeHidden = new ArrayList<>();
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_NAME);
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
|
||||
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
|
||||
@@ -268,8 +286,8 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
||||
return cell.getProperty().getValue().toString().toLowerCase();
|
||||
} else if (SPUILabelDefinitions.ACTION.equals(cell.getPropertyId())) {
|
||||
return SPUILabelDefinitions.ACTION.toLowerCase();
|
||||
} else if (SPUILabelDefinitions.VAR_NAME.equals(cell.getPropertyId())) {
|
||||
return cell.getProperty().getValue().toString();
|
||||
} else if (ROLLOUT_RENDERER_DATA.equals(cell.getPropertyId())) {
|
||||
return ((RolloutRendererData) cell.getProperty().getValue()).getName();
|
||||
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
|
||||
return DistributionBarHelper
|
||||
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.eclipse.hawkbit.repository.RolloutManagement;
|
||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.repository.model.TargetWithActionStatus;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.components.ProxyTarget;
|
||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||
@@ -105,8 +106,8 @@ public class RolloutGroupTargetsBeanQuery extends AbstractBeanQuery<ProxyTarget>
|
||||
prxyTarget.setLastModifiedDate(SPDateTimeUtil.getFormattedDate(targ.getLastModifiedAt()));
|
||||
prxyTarget.setCreatedDate(SPDateTimeUtil.getFormattedDate(targ.getCreatedAt()));
|
||||
prxyTarget.setCreatedAt(targ.getCreatedAt());
|
||||
prxyTarget.setCreatedByUser(HawkbitCommonUtil.getIMUser(targ.getCreatedBy()));
|
||||
prxyTarget.setModifiedByUser(HawkbitCommonUtil.getIMUser(targ.getLastModifiedBy()));
|
||||
prxyTarget.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(targ));
|
||||
prxyTarget.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(targ));
|
||||
if (targetWithActionStatus.getStatus() != null) {
|
||||
prxyTarget.setStatus(targetWithActionStatus.getStatus());
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
|
||||
|
||||
downloadAnonymousCheckBox = SPUIComponentProvider.getCheckBox("", DIST_CHECKBOX_STYLE, null, false, "");
|
||||
downloadAnonymousCheckBox.setId("downloadanonymouscheckbox");
|
||||
downloadAnonymousCheckBox.setValue(targetSecurityTokenAuthenticationConfigurationItem.isConfigEnabled());
|
||||
downloadAnonymousCheckBox.setValue(anonymousDownloadAuthenticationConfigurationItem.isConfigEnabled());
|
||||
downloadAnonymousCheckBox.addValueChangeListener(this);
|
||||
anonymousDownloadAuthenticationConfigurationItem.addChangeListener(this);
|
||||
gridLayout.addComponent(downloadAnonymousCheckBox, 0, 3);
|
||||
|
||||
@@ -20,7 +20,6 @@ import java.util.Map.Entry;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.eclipse.hawkbit.im.authentication.UserPrincipal;
|
||||
import org.eclipse.hawkbit.repository.SoftwareManagement;
|
||||
import org.eclipse.hawkbit.repository.model.AssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.NamedEntity;
|
||||
@@ -34,9 +33,6 @@ import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status;
|
||||
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery;
|
||||
import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory;
|
||||
import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
|
||||
@@ -605,31 +601,6 @@ public final class HawkbitCommonUtil {
|
||||
return requiredExtraWidth + minTableWidth;
|
||||
}
|
||||
|
||||
/**
|
||||
* get formatted name - lastname,firstname.
|
||||
*
|
||||
* @param user
|
||||
* user name
|
||||
* @return String formatted name
|
||||
*/
|
||||
public static String getFormattedName(final UserDetails user) {
|
||||
final StringBuilder formattedName = new StringBuilder();
|
||||
if (user instanceof UserPrincipal) {
|
||||
if (trimAndNullIfEmpty(((UserPrincipal) user).getLastname()) != null) {
|
||||
formattedName.append(((UserPrincipal) user).getLastname());
|
||||
}
|
||||
if (trimAndNullIfEmpty(((UserPrincipal) user).getFirstname()) != null) {
|
||||
if (formattedName.length() > 0) {
|
||||
formattedName.append(", ");
|
||||
}
|
||||
formattedName.append(((UserPrincipal) user).getFirstname());
|
||||
}
|
||||
} else if (user != null) {
|
||||
formattedName.append(user.getUsername());
|
||||
}
|
||||
return formattedName.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* get the Last sequence of string which is after last dot in String.
|
||||
*
|
||||
@@ -686,30 +657,6 @@ public final class HawkbitCommonUtil {
|
||||
return exeJS.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get IM User for user UUID.
|
||||
*
|
||||
* @param uuid
|
||||
* @return imReslovedUser user details
|
||||
*/
|
||||
public static String getIMUser(final String uuid) {
|
||||
// Get modifed user
|
||||
String imReslovedUser = HawkbitCommonUtil.SP_STRING_SPACE;
|
||||
if (HawkbitCommonUtil.trimAndNullIfEmpty(uuid) != null) {
|
||||
final UserDetailsService idManagement = SpringContextHelper.getBean(UserDetailsService.class);
|
||||
try {
|
||||
imReslovedUser = HawkbitCommonUtil.getFormattedName(idManagement.loadUserByUsername(uuid));
|
||||
} catch (final UsernameNotFoundException e) { // NOSONAR
|
||||
// nope not need to handle
|
||||
}
|
||||
// If Null display the UID
|
||||
if (HawkbitCommonUtil.trimAndNullIfEmpty(imReslovedUser) == null) {
|
||||
imReslovedUser = uuid;
|
||||
}
|
||||
}
|
||||
return imReslovedUser;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get formatted label.Appends ellipses if content does not fit the label.
|
||||
*
|
||||
|
||||
@@ -15,7 +15,9 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.time.DurationFormatUtils;
|
||||
import org.eclipse.hawkbit.repository.model.BaseEntity;
|
||||
|
||||
import com.vaadin.server.WebBrowser;
|
||||
|
||||
@@ -80,14 +82,45 @@ public final class SPDateTimeUtil {
|
||||
* @param lastQueryDate
|
||||
* @return String formatted date
|
||||
*/
|
||||
|
||||
public static String getFormattedDate(final Long lastQueryDate) {
|
||||
return formatDate(lastQueryDate, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get formatted date 'created at' by entity.
|
||||
*
|
||||
* @param baseEntity
|
||||
* the entity
|
||||
* @return String formatted date
|
||||
*/
|
||||
public static String formatCreatedAt(final BaseEntity baseEntity) {
|
||||
if (baseEntity == null) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
return formatDate(baseEntity.getCreatedAt(), StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get formatted date 'last modified at' by entity.
|
||||
*
|
||||
* @param baseEntity
|
||||
* the entity
|
||||
* @return String formatted date
|
||||
*/
|
||||
public static String formatLastModifiedAt(final BaseEntity baseEntity) {
|
||||
if (baseEntity == null) {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
return formatDate(baseEntity.getLastModifiedAt(), StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
private static String formatDate(final Long lastQueryDate, final String defaultString) {
|
||||
if (lastQueryDate != null) {
|
||||
final SimpleDateFormat format = new SimpleDateFormat(SPUIDefinitions.LAST_QUERY_DATE_FORMAT);
|
||||
format.setTimeZone(getBrowserTimeZone());
|
||||
return format.format(new Date(lastQueryDate));
|
||||
}
|
||||
return null;
|
||||
return defaultString;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -143,9 +143,15 @@
|
||||
.valo-menu-title {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.v-menubar-user-menu:after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.v-menubar-menuitem-user-menuitem {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.v-menubar-user-menu > .v-menubar-menuitem {
|
||||
white-space: normal !important;
|
||||
.v-icon {
|
||||
|
||||
@@ -19,12 +19,23 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.v-context-menu .v-context-menu-item-basic-icon-container{
|
||||
height:0px !important;
|
||||
width:0px !important;
|
||||
}
|
||||
|
||||
.v-context-menu, .v-context-menu .v-context-menu-item-basic{
|
||||
.v-context-menu .v-context-menu-item-basic{
|
||||
background-color: #feffff !important;
|
||||
border-radius: 4px;
|
||||
font-family : $app-font-family;
|
||||
font-size : $app-text-font-size;
|
||||
font-weight : normal;
|
||||
font-style : normal;
|
||||
}
|
||||
|
||||
|
||||
.v-context-menu{
|
||||
background-color: #feffff !important;
|
||||
border-radius: 4px;
|
||||
}
|
||||
@@ -33,6 +44,7 @@
|
||||
@include valo-gradient($color: $hawkbit-primary-color);
|
||||
background-color: $hawkbit-primary-color !important;
|
||||
color: #e8eef3;
|
||||
height: 30px;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
@@ -77,5 +89,9 @@
|
||||
border-left: $v-grid-border-size solid $widget-border-color ;
|
||||
}
|
||||
|
||||
.v-button-boldhide{
|
||||
text-decoration:none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
4
pom.xml
4
pom.xml
@@ -74,7 +74,7 @@
|
||||
<!-- Vaadin versions - START -->
|
||||
<vaadin.spring.version>1.0.0</vaadin.spring.version>
|
||||
<vaadin.spring.addon.version>0.0.6.RELEASE</vaadin.spring.addon.version>
|
||||
<vaadin.version>7.6.4</vaadin.version>
|
||||
<vaadin.version>7.6.5</vaadin.version>
|
||||
<vaadin.plugin.version>${vaadin.version}</vaadin.plugin.version>
|
||||
<vaadin.addon.vaadin-lazyquerycontainer.version>7.4.0.1</vaadin.addon.vaadin-lazyquerycontainer.version>
|
||||
<vaadin.addon.flexibleoptiongroup.version>2.2.0</vaadin.addon.flexibleoptiongroup.version>
|
||||
@@ -94,7 +94,7 @@
|
||||
<json-path.version>0.9.1</json-path.version>
|
||||
<aspectj.version>1.8.5</aspectj.version>
|
||||
<guava.version>19.0</guava.version>
|
||||
<mariadb-java-client.version>1.3.5</mariadb-java-client.version>
|
||||
<mariadb-java-client.version>1.4.3</mariadb-java-client.version>
|
||||
<embedded-mongo.version>1.50.2</embedded-mongo.version>
|
||||
<jersey-client.version>1.18.1</jersey-client.version>
|
||||
<javax.el-api.version>2.2.4</javax.el-api.version>
|
||||
|
||||
Reference in New Issue
Block a user