Merge branch 'master' into feature_target_filtering_supports_overdue

Conflicts:
	hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java
	hawkbit-ui/src/main/resources/messages_de.properties
	hawkbit-ui/src/main/resources/messages_en.properties
This commit is contained in:
Dominik Herbst
2016-10-13 10:46:00 +02:00
70 changed files with 3533 additions and 1305 deletions

View File

@@ -263,9 +263,9 @@ public class CommonDialogWindow extends Window {
if (field instanceof Table) {
((Table) field).addItemSetChangeListener(new ChangeListener(field));
} else {
field.addValueChangeListener(new ChangeListener(field));
}
field.addValueChangeListener(new ChangeListener(field));
}
}

View File

@@ -0,0 +1,107 @@
/**
* 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.detailslayout;
import java.util.List;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.VaadinSessionScope;
import com.vaadin.ui.Table;
import com.vaadin.ui.themes.ValoTheme;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
/**
*
* DistributionSet TargetFilterQuery table
*
*/
@SpringComponent
@VaadinSessionScope
public class TargetFilterQueryDetailsTable extends Table {
private static final long serialVersionUID = 2913758299611837718L;
private static final String TFQ_NAME = "name";
private static final String TFQ_QUERY = "query";
private I18N i18n;
/**
*
* @param i18n
*/
public void init(final I18N i18n) {
this.i18n = i18n;
createTable();
}
/**
* Populate software module metadata.
*
* @param distributionSet the selected distribution set
*/
public void populateTableByDistributionSet(final DistributionSet distributionSet) {
removeAllItems();
if (distributionSet == null) {
return;
}
Container dataSource = getContainerDataSource();
List<TargetFilterQuery> filters = distributionSet.getAutoAssignFilters();
filters.forEach(query -> {
Object itemId = dataSource.addItem();
Item item = dataSource.getItem(itemId);
item.getItemProperty(TFQ_NAME).setValue(query.getName());
item.getItemProperty(TFQ_QUERY).setValue(query.getQuery());
});
}
private void createTable() {
addStyleName(ValoTheme.TABLE_NO_HORIZONTAL_LINES);
addStyleName(ValoTheme.TABLE_NO_STRIPES);
addStyleName(SPUIStyleDefinitions.SW_MODULE_TABLE);
addStyleName("details-layout");
setSelectable(false);
setImmediate(true);
setContainerDataSource(getDistSetContainer());
setColumnHeaderMode(ColumnHeaderMode.EXPLICIT);
addTableHeader();
setSizeFull();
// same as height of other tabs in details tabsheet
setHeight(116, Unit.PIXELS);
}
private IndexedContainer getDistSetContainer() {
final IndexedContainer container = new IndexedContainer();
container.addContainerProperty(TFQ_NAME, String.class, "");
container.addContainerProperty(TFQ_QUERY, String.class, "");
setColumnExpandRatio(TFQ_NAME, 0.4F);
setColumnAlignment(TFQ_NAME, Align.LEFT);
setColumnExpandRatio(TFQ_QUERY, 0.6F);
setColumnAlignment(TFQ_QUERY, Align.LEFT);
return container;
}
private void addTableHeader() {
setColumnHeader(TFQ_NAME, i18n.get("header.target.filter.name"));
setColumnHeader(TFQ_QUERY, i18n.get("header.target.filter.query"));
}
}

View File

@@ -10,6 +10,9 @@ package org.eclipse.hawkbit.ui.components;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.ui.common.DistributionSetIdName;
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
/**
* Proxy for {@link DistributionSet}.
@@ -39,6 +42,33 @@ public class ProxyDistribution {
private String version;
private String description;
/**
* Creates an empty proxy distribution set
*/
public ProxyDistribution() {
// Default constructor
}
/**
* Creates a new proxy distribution set by using the values from a distribution set
* @param distributionSet the source distribution set
*/
public ProxyDistribution(DistributionSet distributionSet) {
setName(distributionSet.getName());
setDescription(distributionSet.getDescription());
setDistId(distributionSet.getId());
setId(distributionSet.getId());
setVersion(distributionSet.getVersion());
setCreatedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getCreatedAt()));
setLastModifiedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getLastModifiedAt()));
setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(distributionSet));
setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(distributionSet));
setNameVersion(
HawkbitCommonUtil.getFormattedNameVersion(distributionSet.getName(), distributionSet.getVersion()));
setIsComplete(distributionSet.isComplete());
}
/**
* @return the nameVersion
*/

View File

@@ -26,6 +26,7 @@ public class ProxyTargetFilter {
private String createdBy;
private String lastModifiedBy;
private String query;
private ProxyDistribution autoAssignDistributionSet;
public String getCreatedDate() {
return createdDate;
@@ -90,4 +91,11 @@ public class ProxyTargetFilter {
this.createdBy = createdBy;
}
public ProxyDistribution getAutoAssignDistributionSet() {
return autoAssignDistributionSet;
}
public void setAutoAssignDistributionSet(ProxyDistribution autoAssignDistributionSet) {
this.autoAssignDistributionSet = autoAssignDistributionSet;
}
}

View File

@@ -25,6 +25,7 @@ import org.eclipse.hawkbit.ui.common.DistributionSetIdName;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetMetadatadetailslayout;
import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsTable;
import org.eclipse.hawkbit.ui.common.detailslayout.TargetFilterQueryDetailsTable;
import org.eclipse.hawkbit.ui.common.tagdetails.DistributionTagToken;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
@@ -91,6 +92,8 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet
private DistributionSetMetadatadetailslayout dsMetadataTable;
private TargetFilterQueryDetailsTable tfqDetailsTable;
private VerticalLayout tagsLayout;
private Map<String, StringBuilder> assignedSWModule;
@@ -103,9 +106,14 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet
softwareModuleTable = new SoftwareModuleDetailsTable();
softwareModuleTable.init(getI18n(), true, getPermissionChecker(), distributionSetManagement, getEventBus(),
manageDistUIState);
dsMetadataTable = new DistributionSetMetadatadetailslayout();
dsMetadataTable.init(getI18n(), getPermissionChecker(), distributionSetManagement, dsMetadataPopupLayout,
entityFactory);
tfqDetailsTable = new TargetFilterQueryDetailsTable();
tfqDetailsTable.init(getI18n());
super.init();
}
@@ -120,6 +128,7 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet
populateModule();
populateTags();
populateMetadataDetails();
populateTargetFilterQueries();
}
private void populateModule() {
@@ -277,6 +286,10 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet
dsMetadataTable.populateDSMetadata(getSelectedBaseEntity());
}
protected void populateTargetFilterQueries() {
tfqDetailsTable.populateTableByDistributionSet(getSelectedBaseEntity());
}
private void updateDistributionSetDetailsLayout(final String type, final Boolean isMigrationRequired) {
final VerticalLayout detailsTabLayout = getDetailsLayout();
detailsTabLayout.removeAllComponents();
@@ -332,6 +345,7 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet
detailsTab.addTab(createTagsLayout(), getI18n().get("caption.tags.tab"), null);
detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null);
detailsTab.addTab(dsMetadataTable, getI18n().get("caption.metadata"), null);
detailsTab.addTab(tfqDetailsTable, getI18n().get("caption.auto.assignment.ds"), null);
}
@Override

View File

@@ -20,10 +20,8 @@ import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetFilter;
import org.eclipse.hawkbit.repository.model.DistributionSetFilter.DistributionSetFilterBuilder;
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;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.SpringContextHelper;
import org.springframework.data.domain.Page;
@@ -43,11 +41,12 @@ public class ManageDistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
private static final long serialVersionUID = 5176481314404662215L;
private Sort sort = new Sort(Direction.ASC, "createdAt");
private String searchText = null;
private String searchText;
private transient DistributionSetManagement distributionSetManagement;
private transient Page<DistributionSet> firstPageDistributionSets = null;
private transient Page<DistributionSet> firstPageDistributionSets;
private DistributionSetType distributionSetType = null;
private DistributionSetType distributionSetType;
private Boolean dsComplete;
/**
*
@@ -65,14 +64,17 @@ public class ManageDistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
if (!Strings.isNullOrEmpty(searchText)) {
searchText = String.format("%%%s%%", searchText);
}
if (null != queryConfig.get(SPUIDefinitions.FILTER_BY_DISTRIBUTION_SET_TYPE)) {
if (queryConfig.get(SPUIDefinitions.FILTER_BY_DISTRIBUTION_SET_TYPE) != null) {
distributionSetType = (DistributionSetType) queryConfig
.get(SPUIDefinitions.FILTER_BY_DISTRIBUTION_SET_TYPE);
}
if(queryConfig.get(SPUIDefinitions.FILTER_BY_DS_COMPLETE) != null) {
dsComplete = (Boolean)queryConfig.get(SPUIDefinitions.FILTER_BY_DS_COMPLETE);
}
}
if (sortStates.length > 0) {
// Initalize sort
// Initialize sort
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortPropertyIds[0]);
// Add sort
for (int distId = 1; distId < sortPropertyIds.length; distId++) {
@@ -96,27 +98,17 @@ public class ManageDistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
} else if (Strings.isNullOrEmpty(searchText)) {
// if no search filters available
distBeans = getDistributionSetManagement().findDistributionSetsByDeletedAndOrCompleted(
new OffsetBasedPageRequest(startIndex, count, sort), false, null);
new OffsetBasedPageRequest(startIndex, count, sort), false, dsComplete);
} else {
final DistributionSetFilter distributionSetFilter = new DistributionSetFilterBuilder().setIsDeleted(false)
.setIsComplete(dsComplete)
.setSearchText(searchText).setSelectDSWithNoTag(Boolean.FALSE).setType(distributionSetType).build();
distBeans = getDistributionSetManagement().findDistributionSetsByFilters(
new PageRequest(startIndex / count, count, sort), distributionSetFilter);
}
for (final DistributionSet distributionSet : distBeans) {
final ProxyDistribution proxyDistribution = new ProxyDistribution();
proxyDistribution.setName(distributionSet.getName());
proxyDistribution.setDescription(distributionSet.getDescription());
proxyDistribution.setDistId(distributionSet.getId());
proxyDistribution.setId(distributionSet.getId());
proxyDistribution.setVersion(distributionSet.getVersion());
proxyDistribution.setCreatedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getCreatedAt()));
proxyDistribution.setLastModifiedDate(SPDateTimeUtil.getFormattedDate(distributionSet.getLastModifiedAt()));
proxyDistribution.setCreatedByUser(UserDetailsFormatter.loadAndFormatCreatedBy(distributionSet));
proxyDistribution.setModifiedByUser(UserDetailsFormatter.loadAndFormatLastModifiedBy(distributionSet));
proxyDistribution.setIsComplete(distributionSet.isComplete());
proxyDistributions.add(proxyDistribution);
proxyDistributions.add(new ProxyDistribution(distributionSet));
}
return proxyDistributions;
}
@@ -132,9 +124,10 @@ public class ManageDistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
if (Strings.isNullOrEmpty(searchText) && null == distributionSetType) {
// if no search filters available
firstPageDistributionSets = getDistributionSetManagement().findDistributionSetsByDeletedAndOrCompleted(
new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort), false, null);
new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort), false, dsComplete);
} else {
final DistributionSetFilter distributionSetFilter = new DistributionSetFilterBuilder().setIsDeleted(false)
.setIsComplete(dsComplete)
.setSearchText(searchText).setSelectDSWithNoTag(Boolean.FALSE).setType(distributionSetType).build();
firstPageDistributionSets = getDistributionSetManagement().findDistributionSetsByFilters(
new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort), distributionSetFilter);

View File

@@ -0,0 +1,179 @@
/**
* 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.filtermanagement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.eventbus.event.DistributionCreatedEvent;
import org.eclipse.hawkbit.repository.eventbus.event.DistributionDeletedEvent;
import org.eclipse.hawkbit.ui.distributions.dstable.ManageDistBeanQuery;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.eclipse.hawkbit.ui.utils.TableColumn;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory;
import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition;
import org.vaadin.spring.events.EventBus;
import org.vaadin.spring.events.EventScope;
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
import com.vaadin.data.Container;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Table;
import com.vaadin.ui.themes.ValoTheme;
/**
* Table for selecting a distribution set.
*/
@SpringComponent
@ViewScope
public class DistributionSetSelectTable extends Table {
private static final long serialVersionUID = -4307487829435471759L;
@Autowired
private I18N i18n;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private ManageDistUIState manageDistUIState;
private Container container;
/**
* Initialize the component.
*/
@PostConstruct
protected void init() {
setStyleName("sp-table");
setSizeFull();
setSelectable(true);
setMultiSelect(false);
setImmediate(true);
addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES);
addStyleName(ValoTheme.TABLE_SMALL);
populateTableData();
setColumnCollapsingAllowed(false);
setColumnProperties();
setId(UIComponentIdProvider.DIST_SET_SELECT_TABLE_ID);
eventBus.subscribe(this);
}
@PreDestroy
void destroy() {
eventBus.unsubscribe(this);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvents(final List<?> events) {
final Object firstEvent = events.get(0);
if (DistributionCreatedEvent.class.isInstance(firstEvent)
|| DistributionDeletedEvent.class.isInstance(firstEvent)) {
refreshDistributions();
}
}
private void populateTableData() {
container = createContainer();
addContainerproperties();
setContainerDataSource(container);
setColumnProperties();
}
protected Container createContainer() {
final Map<String, Object> queryConfiguration = prepareQueryConfigFilters();
final BeanQueryFactory<ManageDistBeanQuery> distributionQF = new BeanQueryFactory<>(ManageDistBeanQuery.class);
distributionQF.setQueryConfiguration(queryConfiguration);
return new LazyQueryContainer(
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_DIST_ID_NAME),
distributionQF);
}
private void addContainerproperties() {
/* Create HierarchicalContainer container */
container.addContainerProperty(SPUILabelDefinitions.NAME, String.class, null);
container.addContainerProperty(SPUILabelDefinitions.VAR_VERSION, String.class, null);
}
private List<TableColumn> getVisbleColumns() {
final List<TableColumn> columnList = new ArrayList<>(2);
columnList.add(new TableColumn(SPUILabelDefinitions.NAME, i18n.get("header.name"), 0.6F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get("header.version"), 0.4F));
return columnList;
}
private void setColumnProperties() {
setVisibleColumns(getVisbleColumns().stream().map(column -> {
setColumnHeader(column.getColumnPropertyId(), column.getColumnHeader());
setColumnExpandRatio(column.getColumnPropertyId(), column.getExpandRatio());
return column.getColumnPropertyId();
}).toArray());
}
private Map<String, Object> prepareQueryConfigFilters() {
final Map<String, Object> queryConfig = new HashMap<>();
manageDistUIState.getManageDistFilters().getSearchText()
.ifPresent(value -> queryConfig.put(SPUIDefinitions.FILTER_BY_TEXT, value));
if (null != manageDistUIState.getManageDistFilters().getClickedDistSetType()) {
queryConfig.put(SPUIDefinitions.FILTER_BY_DISTRIBUTION_SET_TYPE,
manageDistUIState.getManageDistFilters().getClickedDistSetType());
}
queryConfig.put(SPUIDefinitions.FILTER_BY_DS_COMPLETE, Boolean.TRUE);
return queryConfig;
}
private void refreshDistributions() {
final LazyQueryContainer dsContainer = (LazyQueryContainer) getContainerDataSource();
final int size = dsContainer.size();
if (size < SPUIDefinitions.MAX_TABLE_ENTRIES) {
refreshTablecontainer();
}
if (size != 0) {
setData(SPUIDefinitions.DATA_AVAILABLE);
}
}
private Object getItemIdToSelect() {
if (manageDistUIState.getSelectedDistributions().isPresent()) {
return manageDistUIState.getSelectedDistributions().get();
}
return null;
}
private void selectRow() {
setValue(getItemIdToSelect());
}
private void refreshTablecontainer() {
final LazyQueryContainer dsContainer = (LazyQueryContainer) getContainerDataSource();
dsContainer.refresh();
selectRow();
}
}

View File

@@ -0,0 +1,307 @@
/**
* 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.filtermanagement;
import com.vaadin.server.FontAwesome;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
import org.eclipse.hawkbit.ui.common.DistributionSetIdName;
import org.eclipse.hawkbit.ui.common.builder.WindowBuilder;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleNoBorderWithIcon;
import org.eclipse.hawkbit.ui.filtermanagement.event.CustomFilterUIEvent;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventBus;
import com.vaadin.data.Property;
import com.vaadin.server.Sizeable;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import java.io.Serializable;
/**
* Creates a dialog window to select the distribution set for a target filter query.
*/
@SpringComponent
@ViewScope
public class DistributionSetSelectWindow
implements CommonDialogWindow.SaveDialogCloseListener, Property.ValueChangeListener {
private static final long serialVersionUID = 4752345414134989396L;
@Autowired
private I18N i18n;
@Autowired
private DistributionSetSelectTable dsTable;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient DistributionSetManagement distributionSetManagement;
@Autowired
private transient TargetManagement targetManagement;
@Autowired
private transient TargetFilterQueryManagement targetFilterQueryManagement;
private CommonDialogWindow window;
private CheckBox checkBox;
private VerticalLayout verticalLayout;
private Long tfqId;
private void init() {
Label label = new Label(i18n.get("label.auto.assign.description"));
checkBox = new CheckBox(i18n.get("label.auto.assign.enable"));
checkBox.setId(UIComponentIdProvider.DIST_SET_SELECT_ENABLE_ID);
checkBox.setImmediate(true);
checkBox.addValueChangeListener(this);
verticalLayout = new VerticalLayout();
verticalLayout.addComponent(label);
verticalLayout.addComponent(checkBox);
verticalLayout.addComponent(dsTable);
window = new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW)
.caption(i18n.get("caption.select.auto.assign.dist")).content(verticalLayout).layout(verticalLayout)
.i18n(i18n).saveDialogCloseListener(this).buildCommonDialogWindow();
window.setId(UIComponentIdProvider.DIST_SET_SELECT_WINDOW_ID);
}
public void setValue(DistributionSetIdName distSet) {
dsTable.setVisible(distSet != null);
checkBox.setValue(distSet != null);
dsTable.setValue(distSet);
dsTable.setCurrentPageFirstItemId(distSet);
}
public DistributionSetIdName getValue() {
if (checkBox.getValue()) {
return (DistributionSetIdName) dsTable.getValue();
}
return null;
}
/**
* Shows a distribution set select window for the given target filter query
*
* @param tfqId
* target filter query id
*/
public void showForTargetFilter(Long tfqId) {
this.tfqId = tfqId;
TargetFilterQuery tfq = targetFilterQueryManagement.findTargetFilterQueryById(tfqId);
if(tfq == null) {
throw new IllegalStateException("TargetFilterQuery does not exist for the given id");
}
init();
DistributionSet distributionSet = tfq.getAutoAssignDistributionSet();
if(distributionSet != null) {
setValue(DistributionSetIdName.generate(distributionSet));
} else {
setValue(null);
}
window.setWidth(40.0F, Sizeable.Unit.PERCENTAGE);
UI.getCurrent().addWindow(window);
window.setVisible(true);
}
/**
* Is triggered when the checkbox value changes
*
* @param event
* change event
*/
@Override
public void valueChange(Property.ValueChangeEvent event) {
dsTable.setVisible(checkBox.getValue());
if (window != null) {
window.center();
}
}
/**
* Is triggered when the save button is clicked
*
* @return whether the click should be allowed
*/
@Override
public boolean canWindowSaveOrUpdate() {
return !checkBox.getValue() || dsTable.getValue() != null;
}
/**
* Is called when the new value should be saved after the save button has
* been clicked
*/
@Override
public void saveOrUpdate() {
if(checkBox.getValue() && dsTable.getValue() != null) {
DistributionSetIdName ds = (DistributionSetIdName) dsTable.getValue();
updateTargetFilterQueryDS(tfqId, ds.getId());
} else if(!checkBox.getValue()) {
updateTargetFilterQueryDS(tfqId, null);
}
}
private void updateTargetFilterQueryDS(final Long targetFilterQueryId, final Long dsId) {
TargetFilterQuery tfq = targetFilterQueryManagement.findTargetFilterQueryById(targetFilterQueryId);
if(dsId != null) {
confirmWithConsequencesDialog(tfq, dsId);
} else {
tfq.setAutoAssignDistributionSet(null);
targetFilterQueryManagement.updateTargetFilterQuery(tfq);
eventBus.publish(this, CustomFilterUIEvent.UPDATED_TARGET_FILTER_QUERY);
}
}
private void confirmWithConsequencesDialog(TargetFilterQuery tfq, final Long dsId) {
ConfirmConsequencesDialog dialog = new ConfirmConsequencesDialog(tfq, dsId, new ConfirmCallback() {
@Override
public void onConfirmResult(boolean accepted) {
if(accepted) {
tfq.setAutoAssignDistributionSet(distributionSetManagement.findDistributionSetById(dsId));
targetFilterQueryManagement.updateTargetFilterQuery(tfq);
eventBus.publish(this, CustomFilterUIEvent.UPDATED_TARGET_FILTER_QUERY);
}
}
});
dialog.setWidth(40.0F, Sizeable.Unit.PERCENTAGE);
UI.getCurrent().addWindow(dialog);
dialog.setVisible(true);
}
/**
* A dialog that displays how many targets will be assigned immediately with the
*/
private class ConfirmConsequencesDialog extends Window implements Button.ClickListener {
private static final long serialVersionUID = 7738545414137389326L;
private TargetFilterQuery targetFilterQuery;
private Long distributionSetId;
private Button okButton;
private Button cancelButton;
private ConfirmCallback callback;
public ConfirmConsequencesDialog(TargetFilterQuery targetFilterQuery, final Long dsId, ConfirmCallback callback) {
super(i18n.get("caption.confirm.assign.consequences"));
this.callback = callback;
this.targetFilterQuery = targetFilterQuery;
this.distributionSetId = dsId;
init();
}
private void init() {
setId(UIComponentIdProvider.DIST_SET_SELECT_CONS_WINDOW_ID);
setModal(true);
setResizable(false);
VerticalLayout layout = new VerticalLayout();
layout.setSpacing(true);
layout.setMargin(true);
setContent(layout);
Long targetsCount = targetManagement.countTargetsByTargetFilterQueryAndNonDS(distributionSetId, targetFilterQuery);
Label mainTextLabel;
if(targetsCount == 0) {
mainTextLabel = new Label(i18n.get("message.confirm.assign.consequences.none"));
} else {
mainTextLabel = new Label(i18n.get("message.confirm.assign.consequences.text", new Object[]{targetsCount}));
}
layout.addComponent(mainTextLabel);
HorizontalLayout buttonsLayout = new HorizontalLayout();
buttonsLayout.setSizeFull();
buttonsLayout.setSpacing(true);
buttonsLayout.addStyleName("actionButtonsMargin");
layout.addComponent(buttonsLayout);
okButton = SPUIComponentProvider.getButton(UIComponentIdProvider.SAVE_BUTTON, i18n.get("button.ok"), "", "", true,
FontAwesome.SAVE, SPUIButtonStyleNoBorderWithIcon.class);
okButton.setSizeUndefined();
okButton.addStyleName("default-color");
okButton.addClickListener(this);
buttonsLayout.addComponent(okButton);
buttonsLayout.setComponentAlignment(okButton, Alignment.MIDDLE_RIGHT);
buttonsLayout.setExpandRatio(okButton, 1.0F);
cancelButton = SPUIComponentProvider.getButton(UIComponentIdProvider.CANCEL_BUTTON, i18n.get("button.cancel"), "", "", true,
FontAwesome.TIMES, SPUIButtonStyleNoBorderWithIcon.class);
cancelButton.setSizeUndefined();
cancelButton.addStyleName("default-color");
cancelButton.addClickListener(this);
buttonsLayout.addComponent(cancelButton);
buttonsLayout.setComponentAlignment(cancelButton, Alignment.MIDDLE_LEFT);
buttonsLayout.setExpandRatio(cancelButton, 1.0F);
}
@Override
public void buttonClick(Button.ClickEvent event) {
if(event.getButton().getId().equals(okButton.getId())) {
callback.onConfirmResult(true);
} else {
callback.onConfirmResult(false);
}
close();
}
}
@FunctionalInterface
private interface ConfirmCallback extends Serializable {
void onConfirmResult(boolean accepted);
}
}

View File

@@ -13,8 +13,10 @@ import java.util.List;
import java.util.Map;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
import org.eclipse.hawkbit.ui.components.ProxyDistribution;
import org.eclipse.hawkbit.ui.components.ProxyTargetFilter;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
@@ -85,7 +87,7 @@ public class TargetFilterBeanQuery extends AbstractBeanQuery<ProxyTargetFilter>
targetFilterQuery = getTargetFilterQueryManagement().findAllTargetFilterQuery(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort));
} else {
targetFilterQuery = getTargetFilterQueryManagement().findTargetFilterQueryByFilters(
targetFilterQuery = getTargetFilterQueryManagement().findTargetFilterQueryByName(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort),
searchText);
}
@@ -98,6 +100,11 @@ public class TargetFilterBeanQuery extends AbstractBeanQuery<ProxyTargetFilter>
proxyTarFilter.setModifiedDate(SPDateTimeUtil.getFormattedDate(tarFilterQuery.getLastModifiedAt()));
proxyTarFilter.setLastModifiedBy(UserDetailsFormatter.loadAndFormatLastModifiedBy(tarFilterQuery));
proxyTarFilter.setQuery(tarFilterQuery.getQuery());
final DistributionSet distributionSet = tarFilterQuery.getAutoAssignDistributionSet();
if (distributionSet != null) {
proxyTarFilter.setAutoAssignDistributionSet(new ProxyDistribution(distributionSet));
}
proxyTargetFilter.add(proxyTarFilter);
}
return proxyTargetFilter;
@@ -117,7 +124,7 @@ public class TargetFilterBeanQuery extends AbstractBeanQuery<ProxyTargetFilter>
.findAllTargetFilterQuery(new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort));
} else {
firstPageTargetFilter = getTargetFilterQueryManagement()
.findTargetFilterQueryByFilters(new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort), searchText);
.findTargetFilterQueryByName(new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort), searchText);
}
final long size = firstPageTargetFilter.getTotalElements();

View File

@@ -10,16 +10,21 @@ package org.eclipse.hawkbit.ui.filtermanagement;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import com.vaadin.ui.Button;
import com.vaadin.ui.Link;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
import org.eclipse.hawkbit.ui.components.ProxyDistribution;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.filtermanagement.event.CustomFilterUIEvent;
@@ -44,15 +49,11 @@ import com.vaadin.data.Item;
import com.vaadin.server.FontAwesome;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Link;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.themes.ValoTheme;
/**
*
* Displays list of target filter queries
*
*/
@SpringComponent
@@ -76,6 +77,12 @@ public class TargetFilterTable extends Table {
@Autowired
private transient TargetFilterQueryManagement targetFilterQueryManagement;
@Autowired
private transient DistributionSetManagement distributionSetManagement;
@Autowired
private DistributionSetSelectWindow dsSelectWindow;
private Container container;
private static final int PROPERTY_DEPT = 3;
@@ -142,15 +149,17 @@ public class TargetFilterTable extends Table {
container.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, Date.class, null);
container.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, Date.class, null);
container.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null);
container.addContainerProperty(SPUILabelDefinitions.AUTO_ASSIGN_DISTRIBUTION_SET, String.class, null);
}
private List<TableColumn> getVisbleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
final List<TableColumn> columnList = new ArrayList<>(7);
columnList.add(new TableColumn(SPUILabelDefinitions.NAME, i18n.get("header.name"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_USER, i18n.get("header.createdBy"), 0.15F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_USER, i18n.get("header.createdBy"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.15F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.AUTO_ASSIGN_DISTRIBUTION_SET, i18n.get("header.auto.assignment.ds"), 0.1F));
columnList.add(new TableColumn(SPUIDefinitions.CUSTOM_FILTER_DELETE, i18n.get("header.delete"), 0.1F));
return columnList;
@@ -172,7 +181,7 @@ public class TargetFilterTable extends Table {
return deleteIcon;
}
private String getDeleteIconId(final String targetFilterName) {
private static String getDeleteIconId(final String targetFilterName) {
return new StringBuilder(UIComponentIdProvider.CUSTOM_FILTER_DELETE_ICON).append('.').append(targetFilterName)
.toString();
}
@@ -208,6 +217,9 @@ public class TargetFilterTable extends Table {
addGeneratedColumn(SPUILabelDefinitions.NAME,
(source, itemId, columnId) -> customFilterDetailButton((Long) itemId));
addGeneratedColumn(SPUILabelDefinitions.AUTO_ASSIGN_DISTRIBUTION_SET,
(source, itemId, columnId) -> customFilterDistributionSetButton((Long) itemId));
}
private Button customFilterDetailButton(final Long itemId) {
@@ -222,6 +234,34 @@ public class TargetFilterTable extends Table {
return updateIcon;
}
private Button customFilterDistributionSetButton(final Long itemId) {
final Item row1 = getItem(itemId);
final ProxyDistribution distSet = (ProxyDistribution) row1.getItemProperty(SPUILabelDefinitions.AUTO_ASSIGN_DISTRIBUTION_SET).getValue();
final String buttonId = "distSetButton";
Button updateIcon;
if(distSet == null) {
updateIcon = SPUIComponentProvider.getButton(buttonId, i18n.get("button.no.auto.assignment"),
i18n.get("button.auto.assignment.desc"), null, false, null, SPUIButtonStyleSmallNoBorder.class);
} else {
updateIcon = SPUIComponentProvider.getButton(buttonId, distSet.getNameVersion(),
i18n.get("button.auto.assignment.desc"), null, false, null, SPUIButtonStyleSmallNoBorder.class);
}
updateIcon.addClickListener(this::onClickOfDistributionSetButton);
updateIcon.setData(row1);
updateIcon.addStyleName(ValoTheme.LINK_SMALL + " " + "on-focus-no-border link");
return updateIcon;
}
private void onClickOfDistributionSetButton(final ClickEvent event) {
final Item item = (Item) ((Button) event.getComponent()).getData();
final Long tfqId = (Long)item.getItemProperty(SPUILabelDefinitions.VAR_ID).getValue();
dsSelectWindow.showForTargetFilter(tfqId);
}
private void onClickOfDetailButton(final ClickEvent event) {
final String targetFilterName = (String) ((Button) event.getComponent()).getData();
final TargetFilterQuery targetFilterQuery = targetFilterQueryManagement
@@ -246,14 +286,11 @@ public class TargetFilterTable extends Table {
}
private void setColumnProperties() {
final List<TableColumn> columnList = getVisbleColumns();
final List<Object> swColumnIds = new ArrayList<>();
for (final TableColumn column : columnList) {
setVisibleColumns(getVisbleColumns().stream().map(column -> {
setColumnHeader(column.getColumnPropertyId(), column.getColumnHeader());
setColumnExpandRatio(column.getColumnPropertyId(), column.getExpandRatio());
swColumnIds.add(column.getColumnPropertyId());
}
setVisibleColumns(swColumnIds.toArray());
return column.getColumnPropertyId();
}).toArray());
}
}

View File

@@ -63,13 +63,17 @@ public class CertificateAuthenticationConfigurationItem extends AbstractAuthenti
final Label caRootAuthorityLabel = new LabelBuilder().name("SSL Issuer Hash:").buildLabel();
caRootAuthorityLabel.setDescription(
"The SSL Issuer iRules.X509 hash, to validate against the controller request certifcate.");
caRootAuthorityLabel.setWidthUndefined();
caRootAuthorityTextField = new TextFieldBuilder().immediate(true).maxLengthAllowed(128).buildTextComponent();
caRootAuthorityTextField.setWidth("500px");
caRootAuthorityTextField = new TextFieldBuilder().immediate(true).maxLengthAllowed(160).buildTextComponent();
caRootAuthorityTextField.setWidth("100%");
caRootAuthorityTextField.addTextChangeListener(event -> caRootAuthorityChanged());
caRootAuthorityLayout.addComponent(caRootAuthorityLabel);
caRootAuthorityLayout.setExpandRatio(caRootAuthorityLabel, 0);
caRootAuthorityLayout.addComponent(caRootAuthorityTextField);
caRootAuthorityLayout.setExpandRatio(caRootAuthorityTextField, 1);
caRootAuthorityLayout.setWidth("100%");
detailLayout.addComponent(caRootAuthorityLayout);

View File

@@ -487,6 +487,11 @@ public final class SPUIDefinitions {
*/
public static final String FILTER_BY_INVALID_QUERY = "FilterByInvalidFilterQueryText";
/**
* Filter by distribution set complete.
*/
public static final String FILTER_BY_DS_COMPLETE = "FilterByDistributionSetComplete";
/**
* Sort order of column - created at in target table.
*/

View File

@@ -203,6 +203,10 @@ public final class SPUILabelDefinitions {
* ASSIGNED DISTRIBUTION ID.
*/
public static final String ASSIGNED_DISTRIBUTION_ID = "assignedDistributionSet.id";
/**
* AUTO ASSIGN DISTRIBUTION SET ID
*/
public static final String AUTO_ASSIGN_DISTRIBUTION_SET = "autoAssignDistributionSet";
/**
* ASSIGNED DISTRIBUTION Name & Version.
*/

View File

@@ -885,6 +885,26 @@ public final class UIComponentIdProvider {
*/
public static final String FILTER_SEARCH_ICON_ID = "filter.search.icon";
/**
* Distribution set select table id
*/
public static final String DIST_SET_SELECT_TABLE_ID = "distribution.set.select.table";
/**
* Distribution set select window id
*/
public static final String DIST_SET_SELECT_WINDOW_ID = "distribution.set.select.window";
/**
* Distribution set select consequences window id
*/
public static final String DIST_SET_SELECT_CONS_WINDOW_ID = "distribution.set.select.consequences.window";
/**
* Distribution set select enable checkbox id
*/
public static final String DIST_SET_SELECT_ENABLE_ID = "distribution.set.select.enable";
/**
* /* Private Constructor.
*/

View File

@@ -168,6 +168,7 @@
.v-table-cell-content {
height: 27px;
font-size: 12px;
}
}

View File

@@ -22,8 +22,11 @@ button.no.actions = No actions
button.ok = OK
button.cancel = Cancel
button.upload.file = Upload File
button.no.auto.assignment = none
button.auto.assignment.desc = Select auto assign distribution set
bulk.targets.upload = Please upload csv file.
bulkupload.ds.name = DS Name
button.discard=Discard
# Headers prefix with - header
header.target.table=Targets
@@ -48,6 +51,14 @@ header.dist.twintable.selected=Selected
header.dist.twintable.available=Available
header.target.installed = Installed
header.target.assigned = Assigned
header.type=Type
header.swmodules=SwModules
header.migrations.step=IsRequiredMigrationStep
header.action=Actions
header.action.run=Run
header.action.pause=Pause
header.action.update=Edit
header.status=Status
# Captions prefix with - caption
caption.action.history = Action history for {0}
@@ -59,6 +70,7 @@ caption.filter.simple = Simple Filter
caption.filter.custom = Custom Filter
caption.metadata = Metadata
caption.select.auto.assign.dist = Select auto assignment distribution set
caption.add.softwaremodule = Configure Software Module
caption.add.new.dist = Configure New Distribution
caption.update.dist = Configure Update Distribution
@@ -92,7 +104,8 @@ caption.confirm.abort.action = Confirm Abort Action
caption.filter.delete.confirmbox = Confirm Filter Delete Action
caption.metadata.popup = Metadata of
caption.metadata.delete.action.confirmbox = Confirm Metadata Delete Action
caption.confirm.assign.consequences = Auto assign consequences
caption.auto.assignment.ds = Auto assignment
# Labels prefix with - label
label.dist.details.type = Type :
@@ -129,8 +142,6 @@ label.combobox.tag = Select Tag
label.choose.tag = Choose Tag to update
label.choose.tag.color = Choose Tag Color
label.target.filtered.total = Total filtered targets :
label.filter.selected = Selected:
label.filter.shown = Shown:
label.filter = Filter :
label.target.filter.count = Total Targets :
label.filter.selected = Selected :
@@ -161,13 +172,15 @@ label.filter.by.status = Filter by Status
label.filter.by.overdue = Filter by Overdue
label.target.controller.attrs = <b>Controller attributes</b>
label.target.lastpolldate = Last poll :
label.no.tag.assigned = NO TAG
label.tag.name = Tag name
label.configuration.auth.header = Allow targets to authenticate via a certificate authenticated by an reverse proxy
label.configuration.auth.gatewaytoken = Allow a gateway to authenticate and manage multiple targets through a gateway security token
label.configuration.auth.targettoken = Allow targets to authenticate directly with their target security token
label.configuration.anonymous.download = Allow targets to download artifacts without security credentials
label.unsupported.browser.ie=Sorry! current browser is not supported. Please use Internet Explorer 11 and above
label.auto.assign.description=When an auto assign distribution set is selected, it will be automatically assigned to all targets that match the target filter.
label.auto.assign.enable=Enable auto assignment
label.scheduled=Scheduled
# Checkbox label prefix with - checkbox
checkbox.dist.migration.required = Required Migration Step :
@@ -233,7 +246,6 @@ message.dists.already.deleted = Few distribution(s) are already deleted.Pending
message.target.deleted.pending = Target(s) already deleted.Pending for action
message.dist.deleted.pending = Distribution(s) already deleted.Pending for action
message.dist.delete.success = All selected distribution sets are deleted successfully !
message.dist.discard.success = All distributions selected for delete are discarded successfully !
message.target.delete.success = All selected targets are deleted successfully !
message.target.discard.success = All targets selected for delete are discarded successfully !
message.software.discard.success = All software modules selected for delete are discarded successfully !
@@ -298,7 +310,6 @@ message.no.targets.assiged.fortag = No targets are assigned to tag {0}
message.error.missing.tagname = Please select tag name
message.type.delete = Please unclick the distribution type {0}, then try to delete
message.error.dist.set.type.update= Distribution Set Type is already assigned to targets and cannot be changed
message.target.ds.assign.success = Assignments saved successfully !
message.no.directory.upload = Directory upload is not supported
message.delete.filter.confirm = Are you sure that you want to delete custom filter?
message.delete.filter.success = Custom filter {0} deleted Successfully!
@@ -309,6 +320,8 @@ message.target.filter.duplicate = {0} already exists, please enter another valu
message.tag.use.bulk.upload = {0} cannot be deleted .It is in use in targets bulk upload
message.bulk.upload.tag.assignment.failed = Tag {0} assignment failed as tag no longer exists
message.bulk.upload.tag.assignments.failed= Few tag assignments failed as tags no longer exists
message.confirm.assign.consequences.none = This auto assignment will not have any effect on the currently available targets. In future added targets might match the filter and will receive the selected distribution set automatically.
message.confirm.assign.consequences.text = When you confirm this auto assignment, {0} targets which match the filter will immediately get assigned with the selected distribution set.
# action info
action.target.table.selectall = Select all (Ctrl+A)
@@ -450,12 +463,12 @@ header.assigned.ds = Assigned DS
header.installed.ds = Installed DS
header.target.status = Status
header.target.tags = Tags
header.distributionset = Distribution set
header.numberofgroups = No. of groups
header.detail.status = Detail status
header.total.targets = Total targets
header.key = Key
header.value = Value
header.auto.assignment.ds = Auto assignment
header.target.filter.name = Target filter name
header.target.filter.query = Target filter query
distribution.details.header = Distribution set
target.details.header = Target
@@ -512,3 +525,9 @@ menu.title = Software Provisioning
#Target Filter Management
breadcrumb.target.filter.custom.filters = Custom Filters
notification.configuration.save=Saved changes
controller.polling.title=Polling Configuration
controller.polling.time=Polling Time
controller.polling.overduetime=Polling Overdue Time

View File

@@ -1,506 +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
#
#########################################################################################
# This is the messages_en.properties file
#########################################################################################
# Button names prefix with - button
button.save = Save
button.delete = Delete
button.discard = Discard
button.discard.all = Discard All
button.delete.all = Delete All
button.assign.all = Save Assign
button.actions = You have actions
button.no.actions = No actions
button.ok = OK
button.cancel = Cancel
button.upload.file = Upload File
bulk.targets.upload = Please upload csv file.
bulkupload.ds.name = DS Name
# Headers prefix with - header
header.target.table=Targets
header.dist.table=Distributions
header.filter.tag=Filter by Tag
header.target.filter.tag=Filters
header.first.assignment.table = Targets
header.second.assignment.table = Distributions
header.dist.first.assignment.table = Distributions
header.dist.second.assignment.table = Software Modules
header.third.assignment.table = Discard
header.one.deletedist.table = Distribution Name
header.second.deletedist.table = Discard Changes
header.first.deletetarget.table = Target Name
header.second.deletetarget.table = Discard Changes
header.first.deleteswmodule.table = Delete software
header.first.delete.dist.type.table = DistributionSetType
header.second.delete.dist.type.table = Discard
header.first.delete.swmodule.type.table = Software Module Type
header.second.delete.swmodule.type.table = Discard
header.dist.twintable.selected=Selected
header.dist.twintable.available=Available
header.target.installed = Installed
header.target.assigned = Assigned
# Captions prefix with - caption
caption.action.history = Action history for {0}
caption.error = Error
caption.new.softwaremodule.application = Configure New Application
caption.new.softwaremodule.jvm = Configure New Runtime
caption.new.softwaremodule.os = Configure New OS
caption.metadata = Metadata
caption.add.softwaremodule = Configure Software Module
caption.add.new.dist = Configure New Distribution
caption.update.dist = Configure Update Distribution
caption.add.tag = Configure Tag
caption.add.type = Configure Type
caption.add.new.target = Configure New Target
caption.update.target = Configure Update Target
caption.bulk.upload.targets = Bulk Upload
caption.softwares.distdetail.tab = Modules
caption.tags.tab = Tags
caption.logs.tab = Logs
caption.attributes.tab = Attributes
caption.types.tab = Types
caption.save.window = Action Details
caption.assign.dist.accordion.tab = Assign Distribution Set
caption.delete.dist.accordion.tab = Delete Distributions
caption.delete.target.accordion.tab = Delete Targets
caption.delete.swmodule.accordion.tab = Delete SW Modules
caption.delete.dist.set.type.accordion.tab = Delete Distribution Set Type
caption.delete.sw.module.type.accordion.tab = Delete Software Module Type
caption.attributes = Attributes
caption.panel.dist.installed = Installed Distribution Set
caption.panel.dist.assigned = Assigned Distribution Set
caption.soft.delete.confirmbox = Confirm Software Module Delete Action
caption.cancel.action.confirmbox = Confirm Action Cancellation
caption.forced.datefield = Force update at time
caption.force.action.confirmbox = Confirm Force Active Action
caption.filter.simple = Simple Filter
caption.filter.custom = Custom Filter
caption.filter.delete.confirmbox = Confirm Filter Delete Action
caption.confirm.abort.action = Confirm Abort Action
caption.metadata.popup = Metadata of
caption.metadata.delete.action.confirmbox = Confirm Metadata Delete Action
# Labels prefix with - label
label.dist.details.type = Type :
label.dist.details.name = Name :
label.dist.details.version = Version :
label.dist.details.vendor = Vendor :
label.dist.details.jvm = Runtime :
label.dist.details.ah = Application :
label.dist.details.os = OS :
label.modified.date = Last modified at :
label.modified.by = Last modified by :
label.created.at = Created at :
label.created.by = Created by :
label.target.count = Targets :
label.description = Description :
label.ip = Address :
label.type = Type :
label.assigned.type = Assignment type :
label.assigned.count = {0} Assigned
label.installed.count = {0} Installed
label.mandatory.field = * Mandatory Field
label.components.drop.area = Drop here to delete
label.software.module.drop.area = Delete Software
label.create.tag = Create Tag
label.update.tag = Update Tag
label.create.type = Create Type
label.update.type = Update Type
label.singleAssign.type = Firmware (FW)
label.multiAssign.type = Software (SW)
label.choose.type = Choose Type
label.choose.type.color = Choose Type Color
label.combobox.type = Select Type
label.combobox.tag = Select Tag
label.choose.tag = Choose Tag to update
label.choose.tag.color = Choose Tag Color
label.target.filtered.total = Total filtered targets :
label.filter.selected = Selected:
label.filter.shown = Shown:
label.filter = Filter :
label.target.filter.count = Total Targets :
label.filter.selected = Selected :
label.filter.shown = Shown :
label.filter.status = Status,
label.filter.overdue = Overdue,
label.filter.tags = Tags,
label.filter.text = Search Text
label.filter.dist = Distribution,
label.filter.custom = Custom
label.target.filter.truncated={0} targets has been truncated in the list due the target size limit of {1}, use filters to reduce the targets to be shown
label.active =Active
label.inactive = In-active
label.finished = Finished
label.error = Error
label.warning = Warning
label.running = Running
label.cancelled = Cancelled
label.cancelling = Canceling
label.retrieved = Retrieved
label.download = Downloading
label.scheduled = Scheduled
label.target.id = Controller Id :
label.target.ip = Controller IP :
label.target.security.token = Security token :
label.filter.by.status = Filter by Status
label.filter.by.overdue = Filter by Overdue
label.target.controller.attrs = <b>Controller attributes</b>
label.target.lastpolldate = Last poll :
label.no.tag.assigned = NO TAG
label.tag.name = Tag name
label.configuration.auth.header = Allow targets to authenticate via a certificate authenticated by an reverse proxy
label.configuration.auth.gatewaytoken = Allow a gateway to authenticate and manage multiple targets through a gateway security token
label.configuration.auth.targettoken = Allow targets to authenticate directly with their target security token
label.configuration.anonymous.download = Allow targets to download artifacts without security credentials
label.unsupported.browser.ie=Sorry! current browser is not supported. Please use Internet Explorer 11 and above
# Checkbox label prefix with - checkbox
checkbox.dist.migration.required = Required Migration Step :
checkbox.dist.required.migration.step = Required Migration Step
# TextFields prefix with - textfield
textfield.name = Name
textfield.key = Key
textfield.version = Version
textfield.vendor = Vendor
textfield.description = Description
textfield.customfiltername = Filter name
textfield.value = Value
ui.version = Powered by Bosch IoT Software Provisioning
prompt.target.id = Controller ID
#Tooltips prefix with - tooltip
tooltip.add.module = Add Software Module
tooltip.status.unknown = Unknown
tooltip.status.registered = Registered
tooltip.status.pending = Pending
tooltip.status.error = Error
tooltip.status.insync = In-sync
tooltip.status.overdue = Overdue
tooltip.delete.module = Select and delete Software Module
tooltip.forced.item=Forced update action
tooltip.soft.item=Soft update action which interacts with an user as a attempt update action for example
tooltip.timeforced.item=Soft update until a specific time and then the action will be forced
tooltip.check.for.mandatory=Check to make Mandatory
tooltip.artifact.icon=Show Artifact Details
tooltip.click.to.edit = Click to edit
tooltip.metadata.icon = Manage Metadata
# Notification messages prefix with - message
message.save.success = {0} saved successfully
message.update.success = {0} updated successfully
message.delete.success = {0} deleted successfully
message.dist.installedorassigned = Target {targId} is already assigned/installed with distribution
message.dist.pending.action = Target {0} is already assigned with distribution {1} . Pending for action
message.empty.target.tags= No Tags Created
message.empty.disttype.tags = No Distribution type tags created
message.select.row = Please select a row to drag
message.error = Unknown error occured during the operation. Please contact administrator
message.dist.assigned.one = {0} is assigned to {1}
message.dist.assigned.many = {0} DistributionSets are assigned to {1}
message.dist.unassigned.one = {0} is unassigned from {1}
message.dist.unassigned.many = {0} DistributionSets are unassigned from {1}
message.target.assigned.one = {0} is assigned to {1}
message.target.assigned.many = {0} Targets are assigned to {1}
message.target.unassigned.one = {0} is unassigned from {1}
message.target.unassigned.many = {0} Targets are unassigned from {1}
message.target.assigned.pending = Some target(s) are already assigned.Pending for action
message.cannot.delete = Cannot be deleted
message.check.softwaremodule = Please provide both name and version!
message.cannot.delete.default.dstype = Default distribution set type cannot be deleted
message.duplicate.softwaremodule = {0} : {1} already exists!
message.cannot.delete.default.dstype = Default distribution set type cannot be deleted
message.tag.delete = Please unclick the tag {0}, then try to delete
message.dist.type.check.delete = Please unclick the distribution type {0}, then try to delete
message.swmodule.type.check.delete = Please unclick the Software Module type {0}, then try to delete
message.targets.already.deleted = Few Target(s) are already deleted.Pending for action
message.dists.already.deleted = Few distribution(s) are already deleted.Pending for action
message.target.deleted.pending = Target(s) already deleted.Pending for action
message.dist.deleted.pending = Distribution(s) already deleted.Pending for action
message.dist.delete.success = All selected distribution sets are deleted successfully !
message.dist.discard.success = All distributions selected for delete are discarded successfully !
message.target.delete.success = All selected targets are deleted successfully !
message.target.discard.success = All targets selected for delete are discarded successfully !
message.software.discard.success = All software modules selected for delete are discarded successfully !
message.software.type.discard.success = All software moduleTypes selected for delete are discarded successfully !
message.assign.software.discard.success = All software moduleTypes selected for assign are discarded successfully !
message.software.delete.success = All software modules selected for delete are deleted successfully !
message.software.type.delete.success = All software modules types selected for delete are deleted successfully !
message.dist.set.type.deleted.success = {0} DistributionSetType deleted successfully !
message.new.dist.save.success = {0} - {1} saved successfully
message.dist.update.success = {0} - {1} updated successfully
message.duplicate.dist = Distribution set [{0}] or version [{1}] must be unique, entered value already exists.
message.error.view = No such view: {0}
message.accessdenied.view = No access to view: {0}
message.no.data = No data available
message.target.assignment = {0} Assignment(s) done
message.target.deleted = {0} Target(s) deleted
message.dist.deleted = {0} Distribution Set(s) deleted
message.tag.update.mandatory = Please select the Tag to update
message.tag.duplicate.check = {0} already exists, please enter another value
message.type.key.duplicate.check = Distribution type with key {0} already exists, please give another value
message.type.key.swmodule.duplicate.check = Software Module type with key {0} already exists, please give another value
message.no.action.history = No action history is available for the target : {0}
message.no.available = --No messages available--
message.no.actionupdateds.available = No other updates available for this action
message.mandatory.check = Mandatory details are missing
message.target.duplicate.check = Target [ {0} ] must be unique, entered value already exists.
message.permission.insufficient = Insufficient permissions to perform this action.
message.error.temp = The operation cannot be fulfilled due to {0}. Please contact administrator
message.dist.alreadyassigned = {0} : {1} is already assigned/installed, cannot be updated
message.dist.tag.alreadyassigned = {0} : {1} is already assigned/installed, cannot assign/un-assign to tag
message.dists.unassign.tag.alreadyassigned = Few of the DistributionSet's are already assigned to Target, those cannot be unassigned from Tag"
message.dists.assign.tag.alreadyassigned = Few of the DistributionSet's are already assigned to Target, those cannot be assigned to Tag"
message.dists.tag.assigned = {0} DistributionSet's assigned to Tag {1}
message.dists.tag.unassigned = {0} DistributionSet's un-assigned from Tag {1}
message.dist.no.operation = {0} - already assigned/installed, No operation
message.sm.delete.confirm = Are you sure that you want to delete the selected {0} Software Module?
message.error.os.softmodule = Please select the OS to delete
message.error.ah.softmodule = Please select the Application to delete
message.error.softmodule.deleted = The selected Software Module is already deleted
message.cancel.action = Cancel
message.cancel.action.success = Action cancelled successfully !
message.cancel.action.failed = Unable to cancel the action !
message.cancel.action.confirm = Are you sure that you want to cancel this action?
message.target.alreadyAssigned = {0} Target(s) were already assigned
message.dist.alreadyAssigned = {0} Distribution Set(s) were already assigned
message.force.action = Force
message.force.action.confirm = Are you sure that you want to force this action?
message.force.action.success = Action forced successfully !
message.distribution.no.update = distribution {0} set is already assigned to targets and cannot be changed
message.action.not.allowed = Action not allowed
message.action.did.not.work = Action did not work. Please try again.
message.onlyone.distribution.assigned = Only one distribution set can be assigned
message.onlyone.distribution.dropallowed = Only one distribution set can be dropped
message.error.missing.typename = Missing Type Name
message.error.missing.typenameorkey = Missing Type Name or Key
message.tag.cannot.be.assigned = Target/DS cannot be assigned to {0}
message.no.targets.assiged.fortag = No targets are assigned to tag {0}
message.error.missing.tagname = Please select tag name
message.type.delete = Please unclick the distribution type {0}, then try to delete
message.error.dist.set.type.update= Distribution Set Type is already assigned to targets and cannot be changed
message.target.ds.assign.success = Assignments saved successfully !
message.no.directory.upload = Directory upload is not supported
message.delete.filter.confirm = Are you sure that you want to delete custom filter?
message.delete.filter.success = Custom filter {0} deleted Successfully!
message.create.filter.success = Custom filter {0} created Successfully!
message.update.filter.success = Custom filter updated Successfully!
message.target.filter.validation = Please enter name and query
message.target.filter.duplicate = {0} already exists, please enter another value
message.tag.use.bulk.upload = {0} cannot be deleted .It is in use in targets bulk upload
message.bulk.upload.tag.assignment.failed = Tag {0} assignment failed as tag no longer exists
message.bulk.upload.tag.assignments.failed= Few tag assignments failed as tags no longer exists
#reused messages
soft.module.jvm =Runtime
soft.module.application =Application
soft.module.os =OS
#Artifact upload
message.error.noFileSelected = No file selected for upload
message.error.noProvidedName = Please provide custom file name
message.error.noSwModuleSelected = Please select a Software Module
message.no.duplicateFiles = Duplicate files selected
message.no.duplicateFile = Duplicate file selected :
message.delete.artifact = Are you sure that you want to delete artifact {0} ?
message.duplicate.filename = Duplicate file name
message.swModule.deleted = {0} Software Module(s) deleted
message.error.missing.tagname = Please select tag name
message.upload.failed = Streaming Failed
message.uploadedfile.size.exceeded = File size exceeded .Allowed size {0} bytes
message.uploadedfile.aborted = File upload aborted
message.file.not.found = File not found
message.artifact.deleted =Artifact with file {0} deleted successfully
message.abort.upload = Are you sure that you want to abort the upload?
upload.swModuleTable.header = Software Module
upload.selectedfile.name = file selected for upload
upload.file.name = File name
upload.sha1 = SHA1 checksum
upload.md5 = MD5 checksum
upload.last.modified.date=Last modified date
upload.failed = Failed
upload.success = Success
upload.caption.add.new.swmodule = Configure New Software Module
upload.caption.delete.swmodule = Configure Delete Software Module
upload.swmodule.type = Type
upload.artifact.alreadyExists = Artifact will be overridden as the given name already exists
upload.size = Size(B)
upload.validation = Validation
upload.reason = Reason
upload.action = Action
upload.result.status = Upload status
upload.file = Upload File
upload.caption.update.swmodule = Update Software Module
caption.tab.details = Details
caption.tab.description = Description
caption.delete.artifact.confirmbox = Confirm Artifact Delete Action
#Manage distributions view
label.drop.dist.delete.area = Drop here<br>to delete
caption.assign.software.dist.accordion.tab = Assign Software Modules
message.software.assignment = {0} Assignment(s) done
message.dist.inuse = {0} Distribution is already assigned to target
message.software.dist.already.assigned = {0} Distribution already has Software Module {1}
message.software.dist.type.notallowed = {0} Software Module type can not assign to Distribution {1}
message.target.assigned = {0} is assigned to {1}
message.dist.type.delete = {0} DistributionType(s) Deleted successfully.
message.sw.module.type.delete = {0} Software Module Type(s) deleted successfully.
message.dist.type.discard.success = All Distribution Types are discarded successfully !
message.dist.discard.success = All Distributions are discarded successfully !
message.assign.discard.success = All assignments are discarded successfully !
message.bulk.upload.assignment.failed = Distribution set assignment failed as distribution set no longer exists!
message.key.missing = Key is missing !
message.value.missing = Value is missing !
message.metadata.saved = Metadata with key {0} successfully saved !
message.metadata.updated = Metadata with key {0} successfully updated !
message.metadata.duplicate.check = Metadata with key {0} already exists, please enter another value
message.metadata.deleted.successfully = Metadata with key {0} successfully deleted !
message.confirm.delete.metadata = Are you sure that you want to delete metadata with key {0} ?
message.error.notification.ds.target.assigned = Distribution set {0}:{1} is already assigned to targets and cannot be changed
# Login view
notification.login.title=Welcome to Bosch IoT Software Provisioning.
notification.login.description=Please login with your Bosch Identity Management credentials.
notification.login.failed.title=Login failed!
notification.login.failed.description=Login with the given credentials failed.
notification.login.failed.credentialsexpired.title=Passwort Abgelaufen!
notification.login.failed.credentialsexpired.description=Passwort ist entweder abgelaufen or muss initial gesetzt werden, bitte im Benutzer Verwaltungssystem <20>ndern.
label.login.tenant=Tenant
label.login.username=Username
label.login.password=Password
button.login.signin=Sign in
checkbox.login.rememberme=Remember me
# Links
link.documentation.name=Dokumentation
link.demo.name=Demo
link.requestaccount.name=Beantragung eines Accounts
link.support.name=Support
link.usermanagement.name=Benutzerverwaltung
# System Configuration View
notification.configuration.save=Ver<EFBFBD>nderungen gespeichert
configuration.defaultdistributionset.title=Distribution Set Typ
configuration.defaultdistributionset.select.label=Wahl des default Distribution Set typs:
configuration.savebutton.tooltip=Konfigurationen speichern
configuration.cancellbutton.tooltip=Konfigurationen zur<75>cksetzen
configuration.authentication.title=Authentifikationseinstellungen
#Calendar
calendar.year=Jahr
calendar.years=Jahre
calendar.month=Monat
calendar.months=Monate
calendar.day=Tag
calendar.days=Tage
calendar.hour=Stunde
calendar.hours=Stunden
calendar.minute=Minute
calendar.minutes=Minuten
calendar.second=Sekunde
calendar.seconds=Sekunden
header.name = Name
header.vendor = Vendor
header.version = Version
header.description = Description
header.createdBy = Created By
header.createdDate = Created Date
header.modifiedBy = Modified By
header.modifiedDate = Modified Date
header.delete = Delete
header.assigned.ds = Assigned DS
header.installed.ds = Installed DS
header.status = Status
header.target.tags = Tags
header.distributionset = Distribution set
header.numberofgroups = No. of groups
header.detail.status = Detail status
header.total.targets = Total targets
header.type = Type
header.swmodules = SwModules
header.migrations.step=IsRequiredMigrationStep
header.action=Actions
header.action.run=Run
header.action.pause=Pause
header.action.update=Edit
header.rolloutgroup.installed.percentage = % Finished
header.rolloutgroup.threshold.error = Error threshold
header.rolloutgroup.threshold = Trigger threshold
header.rolloutgroup.target.date = Date and time
header.rolloutgroup.target.message = Messages
rollout.group.label.target.truncated = {0} targets has been truncated in the list due the target size limit of {1}
distribution.details.header = Distribution Set
target.details.header = Target
header.caption.mandatory = Mandatory
header.caption.typename = SoftwareModuleType
header.caption.softwaremodule = SoftwareModule
header.caption.unassign = Unassign
message.sw.unassigned = Software Module {0} successfully unassigned
header.caption.upload.details = Upload details
header.key = Key
header.value = Value
combo.type.tag.name = Type tag name
label.yes = Yes
label.no =No
#Menu
menu.title = Software Provisioning
#Rollout management
prompt.number.of.groups = Number of groups
prompt.tigger.threshold = Trigger threshold
prompt.error.threshold = Error threshold
prompt.distribution.set = Distribution Set
caption.configure.rollout = Configure Rollout
caption.update.rollout = Update Rollout
prompt.target.filter = Custom Target Filter
message.rollout.nonzero.group.number = Number of groups must be greater than zero
message.rollout.max.group.number = Number of groups must not be greater than 500
message.rollout.duplicate.check = Rollout [ {0} ] must be unique, entered value already exists.
message.rollout.field.value.range = Value should be in range {0} to {1}
message.correct.invalid.value = Please correct invalid values
message.enter.number = Please enter number
message.rollout.started = Rollout {0} started successfully
message.rollout.paused = Rollout {0} paused successfully
message.rollout.resumed = Rollout {0} resumed successfully
message.rollout.noofgroups.or.targetfilter.missing = Please enter number of groups and select target filter
message.rollouts = Rollouts
label.target.per.group = Targets per group :
message.dist.already.assigned = Distribution {0} is already assigned to target
message.error.creating.rollout = Server error. Error creating Rollout. Please contact the administrator
message.error.starting.rollout = Server error. Error starting Rollout. Please contact the administrator
#Target Filter Management
breadcrumb.target.filter.custom.filters = Custom Filters

View File

@@ -1,502 +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
#
#########################################################################################
# This is the messages_en.properties file
#########################################################################################
# Button names prefix with - button
button.save = Save
button.delete = Delete
button.discard = Discard
button.discard.all = Discard All
button.delete.all = Delete All
button.assign.all = Save Assign
button.actions = You have actions
button.no.actions = No actions
button.ok = OK
button.cancel = Cancel
button.upload.file = Upload File
bulk.targets.upload = Please upload csv file.
bulkupload.ds.name = DS Name
# Headers prefix with - header
header.target.table=Targets
header.dist.table=Distributions
header.filter.tag=Filter by Tag
header.target.filter.tag=Filters
header.first.assignment.table = Targets
header.second.assignment.table = Distributions
header.dist.first.assignment.table = Distributions
header.dist.second.assignment.table = Software Modules
header.third.assignment.table = Discard
header.one.deletedist.table = Distribution Name
header.second.deletedist.table = Discard Changes
header.first.deletetarget.table = Target Name
header.second.deletetarget.table = Discard Changes
header.first.deleteswmodule.table = Delete software
header.first.delete.dist.type.table = DistributionSetType
header.second.delete.dist.type.table = Discard
header.first.delete.swmodule.type.table = Software Module Type
header.second.delete.swmodule.type.table = Discard
header.dist.twintable.selected=Selected
header.dist.twintable.available=Available
header.target.installed = Installed
header.target.assigned = Assigned
# Captions prefix with - caption
caption.action.history = Action history for {0}
caption.error = Error
caption.new.softwaremodule.application = Configure New Application
caption.new.softwaremodule.jvm = Configure New Runtime
caption.new.softwaremodule.os = Configure New OS
caption.filter.simple = Simple Filter
caption.filter.custom = Custom Filter
caption.metadata = Metadata
caption.add.softwaremodule = Configure Software Module
caption.add.new.dist = Configure New Distribution
caption.update.dist = Configure Update Distribution
caption.add.tag = Configure Tag
caption.add.type = Configure Type
caption.add.new.target = Configure New Target
caption.update.target = Configure Update Target
caption.bulk.upload.targets = Bulk Upload
caption.softwares.distdetail.tab = Modules
caption.tags.tab = Tags
caption.logs.tab = Logs
caption.attributes.tab = Attributes
caption.types.tab = Types
caption.save.window = Action Details
caption.assign.dist.accordion.tab = Assign Software Module
caption.delete.dist.accordion.tab = Delete Distributions
caption.delete.target.accordion.tab = Delete Targets
caption.delete.swmodule.accordion.tab = Delete SW Modules
caption.delete.dist.set.type.accordion.tab = Delete Distribution Set Type
caption.delete.sw.module.type.accordion.tab = Delete Software Module Type
caption.attributes = Attributes
caption.panel.dist.installed = Installed Distribution Set
caption.panel.dist.assigned = Assigned Distribution Set
caption.soft.delete.confirmbox = Confirm Software Module Delete Action
caption.cancel.action.confirmbox = Confirm Action Cancellation
caption.forced.datefield = Force update at time
caption.force.action.confirmbox = Confirm Force Active Action
caption.filter.delete.confirmbox = Confirm Filter Delete Action
caption.metadata.popup = Metadata of
caption.metadata.delete.action.confirmbox = Confirm Metadata Delete Action
caption.confirm.abort.action = Confirm Abort Action
# Labels prefix with - label
label.dist.details.type = Type :
label.dist.details.name = Name :
label.dist.details.version = Version :
label.dist.details.vendor = Vendor :
label.dist.details.jvm = Runtime :
label.dist.details.ah = Application :
label.dist.details.os = OS :
label.modified.date = Last modified at :
label.modified.by = Last modified by :
label.created.at = Created at :
label.created.by = Created by :
label.target.count = Targets :
label.description = Description :
label.ip = Address :
label.type = Type :
label.assigned.type = Assignment type :
label.assigned.count = {0} Assigned
label.installed.count = {0} Installed
label.mandatory.field = * Mandatory Field
label.components.drop.area = Drop here to delete
label.software.module.drop.area = Delete Software
label.create.tag = Create Tag
label.update.tag = Update Tag
label.create.type = Create Type
label.update.type = Update Type
label.singleAssign.type = Firmware (FW)
label.multiAssign.type = Software (SW)
label.choose.type = Choose Type to Update
label.choose.type.color = Choose Type Color
label.combobox.type = Select Type
label.combobox.tag = Select Tag
label.choose.tag = Choose Tag to update
label.choose.tag.color = Choose Tag Color
label.target.filtered.total = Total filtered targets :
label.filter.selected = Selected:
label.filter.shown = Shown:
label.filter.targets = Filtered targets :
label.filter = Filter :
label.target.filter.count = Total Targets :
label.filter.selected = Selected :
label.filter.shown = Shown :
label.filter.status = Status,
label.filter.overdue = Overdue,
label.filter.tags = Tags,
label.filter.text = Search Text
label.filter.dist = Distribution,
label.filter.custom = Custom
label.target.filter.truncated={0} targets has been truncated in the list due the target size limit of {1}, use filters to reduce the targets to be shown
label.active =Active
label.inactive = In-active
label.finished = Finished
label.error = Error
label.warning = Warning
label.running = Running
label.cancelled = Cancelled
label.cancelling = Canceling
label.retrieved = Retrieved
label.download = Downloading
label.scheduled = Scheduled
label.target.id = Controller Id :
label.target.ip = Controller IP :
label.target.security.token = Security token :
label.filter.by.status = Filter by Status
label.filter.by.overdue = Filter by Overdue
label.target.controller.attrs = <b>Controller attributes</b>
label.target.lastpolldate = Last poll :
label.no.tag.assigned = NO TAG
label.tag.name = Tag name
label.configuration.auth.header = Allow targets to authenticate via a certificate authenticated by an reverse proxy
label.configuration.auth.gatewaytoken = Allow a gateway to authenticate and manage multiple targets through a gateway security token
label.configuration.auth.targettoken = Allow targets to authenticate directly with their target security token
label.configuration.anonymous.download = Allow targets to download artifacts without security credentials
label.unsupported.browser.ie=Sorry! current browser is not supported. Please use Internet Explorer 11 and above
# Checkbox label prefix with - checkbox
checkbox.dist.migration.required = Required Migration Step :
checkbox.dist.required.migration.step = Required Migration Step
# TextFields prefix with - textfield
textfield.name = Name
textfield.key = Key
textfield.version = Version
textfield.vendor = Vendor
textfield.description = Description
textfield.customfiltername = Filter name
textfield.value = Value
ui.version = Powered by Bosch IoT Software Provisioning
prompt.target.id = Controller ID
#Tooltips prefix with - tooltip
tooltip.add.module = Add Software Module
tooltip.status.unknown = Unknown
tooltip.status.registered = Registered
tooltip.status.pending = Pending
tooltip.status.error = Error
tooltip.status.insync = In-sync
tooltip.status.overdue = Overdue
tooltip.delete.module = Select and delete Software Module
tooltip.forced.item=Forced update action
tooltip.soft.item=Soft update action which interacts with an user as a attempt update action for example
tooltip.timeforced.item=Soft update until a specific time and then the action will be forced
tooltip.check.for.mandatory=Check to make Mandatory
tooltip.artifact.icon=Show Artifact Details
tooltip.click.to.edit = Click to edit
tooltip.metadata.icon = Manage Metadata
# Notification messages prefix with - message
message.save.success = {0} saved successfully
message.update.success = {0} updated successfully
message.delete.success = {0} deleted successfully
message.dist.installedorassigned = Target {targId} is already assigned/installed with distribution
message.dist.pending.action = Target {0} is already assigned with distribution {1} . Pending for action
message.empty.target.tags= No Tags Created
message.empty.disttype.tags = No Distribution type tags created
message.select.row = Please select a row to drag
message.error = Unknown error occured during the operation. Please contact administrator
message.dist.assigned.one = {0} is assigned to {1}
message.dist.assigned.many = {0} DistributionSets are assigned to {1}
message.dist.unassigned.one = {0} is unassigned from {1}
message.dist.unassigned.many = {0} DistributionSets are unassigned from {1}
message.target.assigned.one = {0} is assigned to {1}
message.target.assigned.many = {0} Targets are assigned to {1}
message.target.unassigned.one = {0} is unassigned from {1}
message.target.unassigned.many = {0} Targets are unassigned from {1}
message.target.assigned.pending = Some target(s) are already assigned.Pending for action
message.cannot.delete = Cannot be deleted
message.check.softwaremodule = Please provide both name and version!
message.duplicate.softwaremodule = {0} : {1} already exists!
message.tag.delete = Please unclick the tag {0}, then try to delete
message.dist.type.check.delete = Please unclick the distribution type {0}, then try to delete
message.swmodule.type.check.delete = Please unclick the Software Module type {0}, then try to delete
message.targets.already.deleted = Few Target(s) are already deleted.Pending for action
message.dists.already.deleted = Few distribution(s) are already deleted.Pending for action
message.target.deleted.pending = Target(s) already deleted.Pending for action
message.dist.deleted.pending = Distribution(s) already deleted.Pending for action
message.dist.delete.success = All selected distribution sets are deleted successfully !
message.dist.discard.success = All distributions selected for delete are discarded successfully !
message.target.delete.success = All selected targets are deleted successfully !
message.target.discard.success = All targets selected for delete are discarded successfully !
message.software.discard.success = All software modules selected for delete are discarded successfully !
message.software.type.discard.success = All software moduleTypes selected for delete are discarded successfully !
message.assign.software.discard.success = All software moduleTypes selected for assign are discarded successfully !
message.software.delete.success = All software modules selected for delete are deleted successfully !
message.software.type.delete.success = All software modules types selected for delete are deleted successfully !
message.dist.set.type.deleted.success = {0} DistributionSetType deleted successfully !
message.new.dist.save.success = {0} - {1} saved successfully
message.dist.update.success = {0} - {1} updated successfully
message.duplicate.dist = Distribution set [{0}] or version [{1}] must be unique, entered value already exists.
message.error.view = No such view: {0}
message.accessdenied.view = No access to view: {0}
message.no.data = No data available
message.target.assignment = {0} Assignment(s) done
message.target.deleted = {0} Target(s) deleted
message.dist.deleted = {0} Distribution set(s) deleted
message.tag.update.mandatory = Please select the Tag to update
message.tag.duplicate.check = {0} already exists, please enter another value
message.type.key.duplicate.check = Distribution type with key {0} already exists, please give another value
message.type.key.swmodule.duplicate.check = Software Module type with key {0} already exists, please give another value
message.no.action.history = No action history is available for the target : {0}
message.no.available = --No messages available--
message.no.actionupdateds.available = No other updates available for this action
message.mandatory.check = Mandatory details are missing
message.target.duplicate.check = Target [ {0} ] must be unique, entered value already exists.
message.permission.insufficient = Insufficient permissions to perform this action.
message.error.temp = The operation cannot be fulfilled due to {0}. Please contact administrator
message.dist.alreadyassigned = {0} : {1} is already assigned/installed, cannot be updated
message.dist.tag.alreadyassigned = {0} : {1} is already assigned/installed, cannot assign/un-assign to tag
message.dists.unassign.tag.alreadyassigned = Few of the DistributionSet's are already assigned to Target, those cannot be unassigned from Tag"
message.dists.assign.tag.alreadyassigned = Few of the DistributionSet's are already assigned to Target, those cannot be assigned to Tag"
message.dists.tag.assigned = {0} DistributionSet's assigned to Tag {1}
message.dists.tag.unassigned = {0} DistributionSet's un-assigned from Tag {1}
message.dist.no.operation = {0} - already assigned/installed, No operation
message.sm.delete.confirm = Are you sure that you want to delete the selected {0} Software Module?
message.error.os.softmodule = Please select the OS to delete
message.error.ah.softmodule = Please select the Application to delete
message.error.softmodule.deleted = The selected Software Module is already deleted
message.cancel.action = Cancel
message.cancel.action.success = Action cancelled successfully !
message.cancel.action.failed = Unable to cancel the action !
message.cancel.action.confirm = Are you sure that you want to cancel this action?
message.target.alreadyAssigned = {0} Target(s) were already assigned
message.dist.alreadyAssigned = {0} Distribution Set(s) were already assigned
message.force.action = Force
message.force.action.confirm = Are you sure that you want to force this action?
message.force.action.success = Action forced successfully !
message.distribution.no.update = distribution {0} set is already assigned to targets and cannot be changed
message.action.not.allowed = Action not allowed
message.action.did.not.work = Action did not work. Please try again.
message.onlyone.distribution.assigned = Only one distribution set can be assigned
message.onlyone.distribution.dropallowed = Only one distribution set can be dropped
message.error.missing.typename = Missing Type Name
message.error.missing.typenameorkey = Missing Type Name or Key or Software Module type
message.tag.cannot.be.assigned = Target/DS cannot be assigned to {0}
message.no.targets.assiged.fortag = No targets are assigned to tag {0}
message.error.missing.tagname = Please select tag name
message.type.delete = Please unclick the distribution type {0}, then try to delete
message.error.dist.set.type.update= Distribution Set Type is already assigned to targets and cannot be changed
message.target.ds.assign.success = Assignments saved successfully !
message.no.directory.upload = Directory upload is not supported
message.delete.filter.confirm = Are you sure that you want to delete custom filter?
message.delete.filter.success = Custom filter {0} deleted Successfully!
message.create.filter.success = Custom filter {0} created Successfully!
message.update.filter.success = Custom filter updated Successfully!
message.target.filter.validation = Please enter name and query
message.target.filter.duplicate = {0} already exists, please enter another value
# action info
action.target.table.selectall = Select all (Ctrl+A)
action.target.table.clear = Clear selections
#reused messages
soft.module.jvm =Runtime
soft.module.application =Application
soft.module.os =OS
#Artifact upload
message.error.noFileSelected = No file selected for upload
message.error.noProvidedName = Please provide custom file name
message.error.noSwModuleSelected = Please select a Software Module
message.no.duplicateFiles = Duplicate files selected
message.no.duplicateFile = Duplicate file selected :
message.delete.artifact = Are you sure that you want to delete artifact {0} ?
message.duplicate.filename = Duplicate file name
message.swModule.deleted = {0} Software Module(s) deleted
message.upload.failed = Streaming Failed
message.uploadedfile.size.exceeded = File size exceeded .Allowed size {0} bytes
message.uploadedfile.aborted = File upload aborted
message.file.not.found = File not found
message.abort.upload = Are you sure that you want to abort the upload?
upload.swModuleTable.header = Software Module
upload.selectedfile.name = file selected for upload
upload.file.name = File name
upload.sha1 = SHA1 checksum
upload.md5 = MD5 checksum
upload.last.modified.date=Last modified date
upload.failed = Failed
upload.success = Success
upload.caption.add.new.swmodule = Configure New Software Module
upload.caption.delete.swmodule = Configure Delete Software Module
upload.swmodule.type = Type
upload.artifact.alreadyExists = Artifact will be overridden as the given name already exists
upload.size = Size(B)
upload.validation = Validation
upload.reason = Reason
upload.action = Action
upload.result.status = Upload status
upload.file = Upload File
upload.caption.update.swmodule = Update Software Module
caption.tab.details = Details
caption.tab.description = Description
caption.delete.artifact.confirmbox = Confirm Artifact Delete Action
#Manage distributions view
label.drop.dist.delete.area = Drop here<br>to delete
caption.assign.software.dist.accordion.tab = Assign Software Modules
message.software.assignment = {0} Software Module(s) Assignment(s) done
message.dist.inuse = {0} Distribution is already assigned to target
message.software.dist.already.assigned = {0} Distribution already has Software Module {1}
message.software.dist.type.notallowed = {0} Software Module type can not assign to Distribution {1}
message.target.assigned = {0} is assigned to {1}
message.dist.type.delete = {0} DistributionType(s) Deleted successfully.
message.sw.module.type.delete = {0} Software Module Type(s) deleted successfully.
message.dist.type.discard.success = All Distribution Types are discarded successfully !
message.dist.discard.success = All Distributions are discarded successfully !
message.assign.discard.success = All assignments are discarded successfully !
message.key.missing = Key is missing !
message.value.missing = Value is missing !
message.metadata.saved = Metadata with key {0} successfully saved !
message.metadata.updated = Metadata with key {0} successfully updated !
message.metadata.duplicate.check = Metadata with key {0} already exists, please enter another value
message.metadata.deleted.successfully = Metadata with key {0} successfully deleted !
message.confirm.delete.metadata = Are you sure that you want to delete metadata with key {0} ?
message.error.notification.ds.target.assigned = Distribution set {0}:{1} is already assigned to targets and cannot be changed
# Login view
notification.login.title=Welcome to Bosch IoT Software Provisioning.
notification.login.description=Please login with your Bosch Identity Management credentials.
notification.login.failed.title=Login failed!
notification.login.failed.description=Login with the given credentials failed.
notification.login.failed.credentialsexpired.title=Password Expired!
notification.login.failed.credentialsexpired.description=Password has been expired or needs to be set initially, please visit the User Management to change or set your password.
label.login.tenant=Tenant
label.login.username=Username
label.login.password=Password
button.login.signin=Sign in
checkbox.login.rememberme=Remember me
# Links
link.documentation.name=Documentation
link.demo.name=Demo
link.requestaccount.name=Request Account
link.support.name=Support
link.usermanagement.name=User Management
# System Configuration View
notification.configuration.save=Saved changes
configuration.defaultdistributionset.title=Distribution Set Type
configuration.defaultdistributionset.select.label=Select the default Distribution Set type:
configuration.savebutton.tooltip=Save Configurations
configuration.cancellbutton.tooltip=Cancel Configurations
configuration.authentication.title=Authentication Configuration
controller.polling.title=Polling Configuration
controller.polling.time=Polling Time
controller.polling.overduetime=Polling Overdue Time
#Calendar
calendar.year=year
calendar.years=years
calendar.month=month
calendar.months=months
calendar.day=day
calendar.days=days
calendar.hour=hour
calendar.hours=hours
calendar.minute=minute
calendar.minutes=minutes
calendar.second=second
calendar.seconds=seconds
header.name = Name
header.vendor = Vendor
header.version = Version
header.description = Description
header.createdBy = Created By
header.createdDate = Created Date
header.modifiedBy = Modified By
header.modifiedDate = Modified Date
header.delete = Delete
header.assigned.ds = Assigned DS
header.installed.ds = Installed DS
header.status = Status
header.target.tags = Tags
header.distributionset = Distribution Set
header.numberofgroups = No. of groups
header.detail.status = Detail status
header.total.targets = Total targets
header.type = Type
header.swmodules = SwModules
header.migrations.step=IsRequiredMigrationStep
header.action=Actions
header.action.run=Run
header.action.pause=Pause
header.action.update=Edit
header.rolloutgroup.installed.percentage = % Finished
header.rolloutgroup.threshold.error = Error threshold
header.rolloutgroup.threshold = Trigger threshold
header.rolloutgroup.target.date = Date and time
header.rolloutgroup.target.message = Messages
rollout.group.label.target.truncated = {0} targets has been truncated in the list due the target size limit of {1}
distribution.details.header = Distribution Set
target.details.header = Target
header.caption.mandatory = Mandatory
header.caption.typename = SoftwareModuleType
header.caption.softwaremodule = SoftwareModule
header.caption.upload.details = Upload details
header.key = Key
header.value = Value
combo.type.tag.name = Type tag name
label.yes = Yes
label.no =No
#Menu
menu.title = Software Provisioning
#Rollout management
prompt.number.of.groups = Number of groups
prompt.tigger.threshold = Trigger threshold
prompt.error.threshold = Error threshold
prompt.distribution.set = Distribution Set
caption.configure.rollout = Configure Rollout
caption.update.rollout = Update Rollout
prompt.target.filter = Custom Target Filter
message.rollout.nonzero.group.number = Number of groups must be greater than zero
message.rollout.max.group.number = Number of groups must not be greater than 500
message.rollout.duplicate.check = Rollout [ {0} ] must be unique, entered value already exists.
message.correct.invalid.value = Please correct invalid values
message.enter.number = Please enter number
message.rollout.field.value.range = Value should be in range {0} to {1}
message.rollout.started = Rollout {0} started successfully
message.rollout.paused = Rollout {0} paused successfully
message.rollout.resumed = Rollout {0} resumed successfully
message.rollout.noofgroups.or.targetfilter.missing = Please enter number of groups and select target filter
message.rollouts = Rollouts
label.target.per.group = Targets per group :
message.dist.already.assigned = Distribution {0} is already assigned to target
message.error.creating.rollout = Server error. Error creating Rollout. Please contact the administrator
message.error.starting.rollout = Server error. Error starting Rollout. Please contact the administrator
#Target Filter Management
breadcrumb.target.filter.custom.filters = Custom Filters