Migrated Hawkbit UI to Vaadin 8 (#980)

* Migrated Hawkbit UI to Vaadin 8

* fixed tag assignment messages
* disable rollout buttons instead of hinding them in Rollout Grid
* fix mssql db error
* small improvements to remove duplications while creating labels and distribution set type combo
* upgraded Vaadin to 8.11.1, upgraded jsoup to 1.11.2 (used by Vaadin 8.11.1), fixed selection in Metadata window, moved Rollout Window components to separate components package
* moved DS/SM type combobox creation to FormComponentBuilder, fixed add to collection error in SoftwareModuleDetails, changed save entity icons to harddrive, common refactoring
* removed duplications between breadcrumb grid headers (RolloutGroupGridHeader, RolloutGroupTargetGridHeader, TargetFilterDetailsGridHeader)
* replace proxy type in proxy objects with simple type info
* made all text fileds lazy (the timeout is 500ms), fixed add rollout window error on getting the bean from layout to controller
* removed duplications between ds to tag and target to tag assignment supports, extracted assignment notification from HawkbitCommonUtils
* fixed search input with caption overlap
* refactored layout visibility and resize listeners
* fixed approval strategy, adapted rollout advanced group ids to always increase
* Combine created and modified column creation
* remove Column<?, ?> variables
* fix confirmation dialog line breaks
* fix grids in details and filters
* fix column creation for upload grids
* add default ExpandRatio, fix rollouts and target filter
* add default addColumn method and fix action grids
* update deployment and rollout grid and grid css
* fix grid column widths
* refactored approval layout
* adapted approval layout
* refactored advanced rollout group layout
* refactored advanced group definitions to use proxy bean
* fixed copy rollout window enable save button
* third draft of Rollout Window validation: added UNKNOWN validation status, validate all layouts after validation listener is added
* second draft of Rollout Window Validation
* first Rollout Window Validation draft for enable/disable save button
* fixed custom target filter de-selection on delete, re-selection on update, reset edit/delete crud menu mode on custom filter tab selection
* added error threshold validation on total target and number of groups change
* added random ids to Proxy identifiable entities without defined ids
* add universal check box generator
* adapted Update and Approve Rollout Window Layout
* adapted setting and getting bean values for Add and Copy Rollout layouts
* fix setting ConfirmationDialog ID
* refactor ConfirmationDialog to use a CommonDialogWindow internally
* fix rollout group definition input width
* remove code duplication in UI grid column creation
* refactored rollout group pie chart and legend by extracing them to their own class VisualGroupDefinitionLayout
* remove code duplication on link creation
* moved creation of AutoStartOptionGroupLayout to FormComponentBuilder
* extracted RolloutFormLayout and SimpleGroupsLayout together with corresponding proxy beans from AddRolloutWindowLayout, adapted code accordingly
* move TimeforcedIcon generation to StatusIconBuilder
* move code to StatusIconBuilder
* use objects to build labels from entity states
* use generic method to generate status icon labels
* moved AdvancedGroupRow from DefineGroupsLayout to separate class
* remove code duplication on icon creation
* removed Optionals from Data Providers
* fixed remaining parts of xss vulnarable components (tags/types)
* added description to key-value details pairs, moved the logic of paginated database access to HawkbitCommonUtils
* further adapted xss atack posibilities
* adapted details header and key-value details
* adapted MetaData header
* adapted Artifact and Action History Grid headers
* adapted artifact download
* adapted already assigned notification and rollout approval permission check
* removed tenant and username cookies from hawkbit login
* adapted attributes sorting by key
* adapted controller attributes details
* removed grid ResizeSupport (can be introduced later if needed)
* refactored grids to not use resizeSupport but rather removing all columns and re-adding them after max/min state transition
* fixed selection of added items
* moved restoreState to AbstractGrid
* unified Ds grids on Distribution and Deployment Views
* moved filter support and drag and drop support to AbstractGrid
* removed stale Sm grid id for Upload view
* removed duplication between SwModuleGrid and SoftwareModuleGrid
* removed unneccessary status icons css properties
* added grid MasterEntitySupport, adapted grids
* fixed tags/types filter deselection after deletion
* fixed deletion success notification, added artifact uploads count check to software module table
* unified target/ds/sm grid headers
* unified DS and SM grid headers and details
* added Delete Support to Rollout, adapted deletion permissions
* introduced EntityResizeSupport, upgraded vaadin version to 8.10.4
* unified ds and sm type filter components
* removed duplications between Target and Ds tag filters
* removed duplication for #buildActionButton
* initial iteration of removing duplications between grids
* added GridActionsVisibilityListener
* added layout visibility listener to filter and rollout views
* unified LayoutResizeListener and LayoutVisibilityListener
* extracted ShowEntityFormLayoutListener
* refactored grid filter listeners
* refactored target filter listeners, introduced filter support
* added GenericEventListener, further unified listeners
* partially unified LayoutViewAware event listeners, added PinningChangedListener, TagFilterListener and TypeFilterListener
* fixed sql exception in case NO_TAG is selected without any additional tags active
* unified entity modified listeners, adapted tag token modified update
* fixed Upload View drop area enable on SM select
* unified selection listeners
* unified search listeners
* added common SearchFilterListener, added temporare EntityModifiedMasterAwareSupport for EntityModifiedListener, fixed Rollout View change after rollout deletion/modification, adapted state restore
* refactored entity modified and selection listeners together with support classes
* added maintenance window and created/modified at tooltips in Action History Window, added id to Bulk Upload popup window and main popup layout, fixed duplicated DS error during DS edit/update
* substituted ShowEntityDetailsEventPayload with SelectionChangedEventPayload in Rollout View for consistency with other Views, unified rollout ui state class
* added builder to EntityModifiedListener, adapted code
* refactored sm type modification of ds type
* fix removing sm type from ds type via ui
* refresh rollout group targets table on group-updated-event
* moved grid label icon creation to SpUiComponent builder
* fixed edit tag/type with invalid colour
* added range validator(0-100) to trigger threshold
* fixed rollout auto start option updates, fixed rollout grid search state restore, extended SPDateTimeUtil
* Rollout Window Form fixes
* small partial fix for error threshold percent/count validation and value change
* fixed time forced empty datetime in Rollouts Update Window
* added workaround for target/ds tags drag and drop due to the missing selection support
* fixed ds unpinning after deletion and completion state change
* added reason to bulk upload failed notification
* fixed target add/update window form name id, introduced separate layout listeners for entity modified events and selection/master changed events, extended grid selection support, refactored corresponding grids, layouts and listeners
* fixed required messages in the from builder, changed asyncExecutor to ui executor for file streaming, fixed auto-assignment for layout
* fixed drag and drop registration for non-selection grid model, small restore state refactoring
* fixed action remote events tests, adapted crudMenu/resize/search header supports to use mode-{mode} classes instead of ids modification
* changed id of metadata popup grid to 'metadata.window.table.id' and details grid to '{typePrefix}.metadata.details.table.id', fixed tag/type cell text wrapping, tooltip shows full tag/type name, removed checkboxes from Distributions Set Type Software module selection grids
* added tooltip to Rollout/RolloutGroup status bar, small bug fixes for Rollout Window target filter and approval
* fixed edit permission validation in DetailsHeader
* unbind distributionsview javascript from vaadin theme
* small refactoring of form component builder, assignment and rollout layout
* remove ds combobox code duplication, fix assig and autoassign popup
* add BoundComponent class, fix assignment popup
* remove duplicates for name, version description and actiontype fields
* removed code duplication, fix assign- and autoassign-popup
* adapted Action history eventing, changed entity modified parent event propagation
* added id to DS details modules grid
* started adapting Action History View
* adapted filter by ds drop area restore
* align drop styling with previous
* fix filter target table by assigned ds
* small refactoring of Deployment View and System config View layouts
* adapted DS tag layout
* fixed incompelete DS deselection and unpinning
* added filter to RemoteEventListener in order to ignore remote events, added select entity on add to grids
* fixed DS modules details, explained why session scope is used for bulk upload
* adapted bulk upload window to be lazy loaded, fixed restore by usinng session scope
* fixed user cell text selection in grid, drop hint highlighting
* fixed undo for iot-update-server config option
* fixed parsing in DurationField and refactored system config view
* removed unused variable from DurationField
* refactored config option view
* fixed polling option value in config option view
* fixed token refresh value in config option view
* added binder auth config option
* added binder to save config option
* added binder for auto cleanup option
* upgraded vaadin to 8.10.0, removed dd package together with CustomAcceptCriteria extension, removed CustomAcceptCriteria tests, removed all vaadin v7 dependencies, removed compatibility server and client
* added selection by pressing key up/down, refactored range selection handler and connector, drag and drop support drop style listener, removed unneccessary styles for selection extension
* show drop hint
* fix h2 cast error
* make unselected row dragable
* add support for selection using Shift and CTRL
* remove grid checkboxes, fix selection and drag and drop
* moved bulk upload classes to own package, started implementing bulk upload window builder
* further adaptations of bulk upload
* started adapting bulk upload
* partially removed stale classes/methods, vaadin v7 imports
* completeted pinning refactoring
* further pinning refactoring, added restore to distributions grid in deployment view
* started adapting pinning of target and distribution set
* further remote eventing refactoring, small styling adaptations
* added 'maximize' and 'minimize' ids to max/min grid icons
* removed event containers, adapting the delayed event bus push strategy, event provider and remote events listener
* small eventing refactoring
* adapted tag filter eventing, removed old event classes
* adapted selection eventing, fixed color styling for grid selection, added countByAssignedId to softwaremodulemanagement
* adapted type filter eventing
* adapted search filter eventing
* adapted actions visibility change eventing in filter layouts
* adapted layout eventing in Deployment View
* adapted layout eventing in Distributions View
* adapted layout eventing in Upload View
* adapted entity modified eventing
* adapted rollout eventing
* fix rollout view and window styling
* handle rollouts view remote events
* adapted eventing in Rollouts View
* fixed Target Filter session state management in Edit Form mode
* adapted target filter query add/update layout to use form layout
* started adapting tags assignment
* removed AbstractNotificationView
* added row border in grids
* fixed restoreState in Target Filters and Target Grid, refatored eventing in Deployment View
* Added event listener for DsSetType
* added confirmation window id for deletion support, added id for action type radio group, reworked restore state, small changes in Deployment view
* started adapting ds grid, ds tags, action history and Deployment View layout
* started adapting target grid
* reworked Target Filter View and event handling
* fixed Target Details error, started adapting Target Grid Layout
* refactored Date time parser
* fixed Date time parser
* fixed formatting
* fixed errors in auto close option
* fixed errors in auto cleanup option
* fixed errors in Polling view option
* adapted filter management view and selection listener behaviour
* cleanup, fix vaadin query to spring pageable convertion
* adapted target tag filter layout
* started adapting Deployment view
* fixed software modules details grid rendering under Distribution Set Details
* adapted artifact details grid popup window for Software Module details
* adapted auto assignment details grid for DS
* added get by ids to target tag management, adapted tag details layout for distribution set tag and target tag
* package structure refactoring
* started adapting software module details tab within distribution set details layout
* excluded javax.validation because of a reference to an old sources file
* fixed system config view misconfiguration
* fixed ids formating, added UI access call for updating entities through listeners
* refactored sm and ds types saving in proxy sm and ds entities
* fixed software module to distribution set assignment and software module dataprovider in Distributions View
* adapted add/update notification for software module and distribution set to show name and version, fixed search text field id
* adapted software module color highlighting in Distributions View
* adapted login ui
* started adapting Distributions View
* unified filter buttons click behaviour, added restore clicked filter to Upload View
* removed duplications in filter headers
* removed duplication in filter type/tag layouts
* added sm and ds type remote events matchers for listener
* adapted metadata details grid, update eventing fo details layout in Upload View
* adapted entity deletion eventing and selection on restore state for Upload View
* adapted file upload events handling, introduced RemoteEventsListener for the complete UI
* adapted Details Header to render two separate labels for caption prefix (entity type) and entity name to prevent xss attack
* upgraded vaadin to version 8.9.3, adapted upload artifact view and corresponding eventing further
* change visibility of components instead of removing them in Upload View
* adapted metadata popup window for target, distribution set and software module
* first iteration of adapting metadata window layout: created meta data dataproviders and window grids for target, ds and sm
* adapted auto assign window layout
* further refactoring of Target filter view and layouts
* adapted software module add/update window layout
* adapted distribution set add/update window layout
* refactored window layouts
* fixed software module add/update layout, adapted target add/update layout
* added validation of empty distribution set type software module types and mandatory property change
* further refactoring of distribution set type add/update window
* adapted distribution set type add/update window
* adapted software module type add/update window layout
* adapted tag layouts and color picker structure
* adapted target and ds tag add/update windows, refactored color picker
* added ds and sm type event containers
* refactored local eventing and remote events handling, mainly only for distributions view
* fixed ui alignment on the right side of the page
* Finalized upload view migration
* Fixed upload layout not enabled problem
* Migrated Upload view. Some small glitches still open.
* moved details headers to layouts
* added callback to update last selected entity in UI state after each grid selection, unified all details layouts
* further refactoring of Target Details
* added selected event publishing to selection support, refactored target details
* started unifying details layouts and adding details support classes
* unified grid layouts
* unified Target Filter Header
* fixed glitches in UI regarding Headers, dapted eventing for crud menu and close header supports
* unified types and tags headers
* unified more headers
* adapted TargetTableHeader to use AbstractGridHeader with Header Support classes, renamed to TargetGridHeader, removed unsused css properties
* added CrudMenuHeaderSupport, refactored AbstractGridHeader
* added AddHeaderSupport, BulkUploadHeaderSupport, CloseHeaderSupport, FilterButtonsHeaderSupport, ResizeHeaderSupport, SearchHeaderSupport, refactored ConfigMenuBar behaviour in MultipleTargetFilter
* started unifying headers
* extracted BulkUpload from AbstractTableHeader to TargetTableHeader
* removed header row for tags and types grids, adapted margin/padding for some layouts, modified css properties for borders, updated vaadin version to 8.8.6, vaadin-spring to 3.2.1
* added javax servlet api maven dependency to hawkbit-autoconfigure, because gwt-user is not used anymore, fixed a couple of runtime errors, hawkbit starts :)
* adapted TargetTableHeader drag and drop in order to filter targets by Distribution Sets, adapted gwt modules to inherit from compatibility Vaadin7WidgetSet, upgraded DistributionBar addon to be compatible with vaadin 8
* added NO TAG button to Target Tag and Distribution Tag layouts
* adapted Distribution Set Types and Software Module Types layouts
* adapted Target Tags layout, Distribution Set Tags Layout, added corresponding drag and drop supports
* migrated from Table to Grid in TargetFilterQueryButtons, adapted click listeners
* adapted twin columns layout for creating/updating Distribution Set Type
* adapted MetaData Details classes
* adapted AbstractMetadataPopupLayout and all children classes, refactored DeleteSupport
* adapted Grid in UploadProgressInfoWindow
* adapted software module details, target filter query details, removed custom combobox for autoassignment, adapted layouts and details
* removed obsolete classes, adapted layouts as needed, removed Custom Renderers because components are used directly within the grids
* added ArtifactDetailsGrid for Upload View, modified Artifact Layout to be consistent with Action History Layout in Deployment View, adapted Views and Layouts
* added SoftwareModuleGrid to Upload View
* migrated SwModuleTable to SwModuleGrid
* migrated Distribution Set Table from Distributions View to Grid, refactored drag and drop
* refactored target grid in Create/Update Filter View
* refactored tag classes to use TagData where possible
* migrated CreateOrupdateFilterTable to grid
* adapted tag token classes
* adapted Layouts, chaned Base Ui Event to except Proxy Entities
* adapted TargetFilterGrid
* Migrated TargetFilterTable to grid
* Removed vaadin Tokenfield dependency
* removed ConfirmationTab, using Component ConfirmationDialog instead; adapted MaintenanceWindowLayout, introduced AssignmentWindowLayout together with corresponding ComponentBuilder and Controller; added Drag and Drop support with differen Assignments support, adapted TargetGrid and DistributionGrid correspondingly; removed TargetAssignmentOperations utility class
* second version of PinSupport
* added DeleteSupport for target and distribution set items deletion
* first draft of PinSupport for pinning targets and distribution setes
* added first draft of Management Distribution Set Grid, adapted the corresponding data provider, adapted AbstractBaseViewFilter (should be checked)
* first draft of Target Grid, refactored Selection support to include multi-selection mode
* extracted single selection support, resize support and master details support from AbstractGrid, added filter type to AbstractGrid so the dataproviders are filterable by default, adapted some data providers to use filters, refactored master-details scenario for action history/status/msg layouts
* Adapted AbstractGrid for resize support, adapted ActionHistoryGrid, ActionStatusGrid, ActionStatusMsgGrid
* added rollout window specific classes (layouts, controllers, component builders)
* changed Rollout/Group/Target List Grids to use vaadin 8 concepts, added temp utility classes
* added ArtifactDataProvider and corresponding ProxyArtifact, SoftwareModuleArtifactsStateDataProvider, SoftwareModuleDistributionsStateDataProvider, TargetFilterStateDataProvider, TargetManagementStateDataProvider, TargetTagDataProvider and corresponding mappers
* added parent Type model class for DistributionSetType and SoftwareModuleType and corresponding ProxyType, added ActionDataProvider, ActionStatusDataProvider, ActionStatusMsgDataProvider, DistributionSetTagDataProvider, DistributionSetTypeDataProvider, SoftwareModuleTypeDataProvider and corresponding mappers
* extended data providers with filter, implemented multiple distribution set data providers for sifferent ui state (views), added target tag data provider, adapted Proxy Tag
* added data providers, mappers and proxy classes for fetching entities from backend and mapping them to ui proxy entities
* removed setImmediate on classes
* fixed usage of option group layouts, removed all setImmediate calls
* removed flexibleoptiongroup dependency and adapted the Option Group Layouts to use the default RadioButtonGroup
* adapted Vaadin Security and fixed Notifications
* Migrated vaadin 7 sources with the Vaadin migration tool to vaadin 8 compatibility mode
* fixed some minor sonar issues
* fixed license headers
* fixed dynamic stylesheet js license header
* adapted java docs parameters description, removed unused event classes
* fixed icon styles, made action icons a little bigger
* fixed download artifact action icon column header, fixed styling for the target filter query add/update layout, made it more responsive instead of hardcoding pixel values
* fixed Notification rendering regarding word wrap
* fixed restore behaviour with the invalid target filter query in Filter View
* replaced List collection with Set for better performance during DS pinning, tag assignment, target status filtering and rollout add/update window validation, ignored irrelevant sonar issues
* disable crud menu button on no CUD permissions, disable Rollout Group Button on missing permissions, removed Target Metadata details tab on missing repository read permissions, removed Autoassignment DS details tab on missing target read permissions, added UIEventPermissionChecker/HawkbitEventPermissionChecker to verify if current user has the required permissions in order to receive push events/notifications
* disable Autoassignment link in case of missing read repository permissions, disable TFQ save button in case of missing update target permissions
* adapted ordering of columns in maximized state
* limited selection in grids to 1000 entities, removed shift+ctrl selection behaviour (due to complex logic for preserving and limiting selection) disable edit/copy rollout on creation, small naming changes and java docs improvements
* added java docs to notification class
* fixed restoration of the default filter value for grids
* added caption to Delete column in grids, made target filter grid columns hidable, stoped propagation of select all event in order to not select the text on the page
* removed com.google.gwt.gwtmockito test dependency
* renamed RemoteEventsListener to HawkbitEntityEventListener to better describe the use-case for the listener
* changed Guava cache to Caffeine cache for EntityModified UI events
* removed obsolete HawkbitErrorNotificationMessage, UINotification is used instead
* added stacked notifications custom extension
* removed unused JUnitParams dependency
* fixed license header for ParallelNotificationConnector
* set ui mode back to production

Signed-off-by: Bogdan Bondar <Bogdan.Bondar@bosch.io>
This commit is contained in:
Bondar Bogdan
2020-08-21 16:57:00 +02:00
committed by GitHub
parent eae34e65cc
commit 9f3ff40658
786 changed files with 49027 additions and 46609 deletions

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c) 2020 Bosch.IO 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
*/
function recreateStylesheet(styleId) {
var stylesheet = document.getElementById(styleId);
if (stylesheet) {
document.head.removeChild(stylesheet);
}
stylesheet = document.createElement('style');
stylesheet.id=styleId;
document.head.appendChild(stylesheet);
return stylesheet;
}
function addStyleRule(stylesheet, selector, rule) {
if (stylesheet) {
if (stylesheet.addRule) {
stylesheet.addRule(selector, rule);
} else if (stylesheet.insertRule) {
stylesheet.insertRule(selector + ' { ' + rule + ' }', stylesheet.cssRules.length);
}
}
}

View File

@@ -10,6 +10,10 @@
@mixin accordion {
.v-accordion-item {
outline: none;
}
//Accordion caption style.accordion is displayed in confirmation popup
.v-accordion-item-caption {
color: $accordion-action-history-title-color !important;

View File

@@ -8,17 +8,6 @@
*/
@mixin action-history {
//Action history headers are adjusted to match other widget header height
.action-history-header {
padding-bottom: 22px;
}
//Artifact details headers are adjusted to match other widget header height
.artifact-details-header {
padding-bottom: 25px;
padding-top: 5px;
}
.action-history-message-grid {
.v-grid-cell {
border: none !important;

View File

@@ -79,7 +79,8 @@
background-color: $widget-bg;
line-height: 1;
text-align: center;
}
padding: 0;
}
//Upload drop layout - Drop icon style
.drop-icon {
@@ -87,7 +88,7 @@
font-size: 40px;
// drop down arrow icon not able to display with center alignment.
// Hence provide margin-top so that it appear at center.
margin-top: 45px;
margin-top: 30px;
}
.upload-button {

View File

@@ -289,6 +289,10 @@
}
.custom-option-group {
font-weight: 400;
> :last-child {
margin-right: 0;
}
}
.links {
padding-left: 22px;
@@ -303,11 +307,4 @@
.form-lastrow {
padding-bottom: 12px !important;
}
.text-cut {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
}

View File

@@ -15,28 +15,26 @@
}
.show-drop-hint {
.type-button-layout {
.v-grid-tablewrapper {
border: 1px dashed $hawkbit-primary-color !important;
}
}
.show-drop-hint.type-button-layout {
border-style: dashed !important;
border-width: 1px !important;
border-color: $hawkbit-primary-color !important;
}
.show-drop-hint.sp-table {
.v-table-body {
border-style: dashed !important;
border-width: 1px !important;
border-color: $hawkbit-primary-color !important;
}
}
.show-drop-hint.v-ddwrapper {
.filter-drop-hint-layout.show-drop-hint {
border: 1px dashed $hawkbit-primary-color !important;
}
//Target table header - distribution filter text field style
.v-slot-filter-drop-hint-layout {
line-height: 21px;
.filter-drop-hint-layout.show-drop-hint.v-horizontallayout-drag-center{
background-color: desaturate(lighten($hawkbit-primary-color, 50%), 20%);
}
.v-grid-row-drag-center::after,.v-grid-body-drag-top::after {
border: none !important;
}
.show-drop-hint .v-grid-row-drag-center .v-grid-cell {
background-image: none;
background-color: desaturate(lighten($hawkbit-primary-color, 50%), 20%);
color: dimgray;
}
}

View File

@@ -12,24 +12,35 @@
//Tag widget header height adjusted to match table header heights
.filter-btns-header-layout {
padding-bottom: 14px;
border-bottom: 1px solid $widget-border-color;
}
//Tag layout style
.filter-btns-main-layout {
background: none repeat scroll 0 0 $widget-bg;
border-radius: $v-border-radius;
}
.filter-btns-layout {
border-radius: 0 0 $v-border-radius $v-border-radius;
border: 1px solid $widget-border-color;
}
//Tag button - clicked
.filter-btn-clicked {
//NO_TAG or Filter tag/type button - clicked
.no-tag-btn-clicked, .filter-btn-clicked .v-button {
color: $tag-button-disabled-grey !important;
}
//Tag table - additional style
.type-button-layout {
background: $widget-bg;
border-top: 1px solid $widget-border-color;
.v-grid-tablewrapper {
border: none;
.v-grid-row > td {
background: $widget-bg;
}
}
.v-table-table {
box-shadow: none !important;
@@ -42,8 +53,11 @@
//Tag button wrapper style
.filter-btn-wrapper {
width: 118px !important;
background: none;
.font-icon {
margin-right: 6px;
}
}
.simple-tag-filter-header{

View File

@@ -22,13 +22,6 @@ $generic-text-font-size: $generic-text-font-scale * $v-font-size;
}
}
@mixin sp-icon-style($sp-button-icon-color: $button-icon-color, $sp-button-size : $icon-font-size) {
height: 15px !important;
width: 15px !important;
color: $sp-button-icon-color;
font-size: $sp-button-size;
}
@mixin generic-styles {
//Generic text style used in table details,search text style ,combo text style etc
@@ -36,10 +29,26 @@ $generic-text-font-size: $generic-text-font-scale * $v-font-size;
font: 300 $generic-text-font-size $app-font-family !important;
}
//Report widget max icon style
.text-bold {
font-weight: bold !important;
}
.text-cut {
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
-icab-text-overflow: ellipsis;
-khtml-text-overflow: ellipsis;
-moz-text-overflow: ellipsis;
-webkit-text-overflow: ellipsis;
overflow: hidden;
}
.icon-only {
@include sp-icon-style($sp-button-size: $icon-font-size);
margin-bottom: 12px !important;
height: 15px !important;
width: 15px !important;
color: $button-icon-color;
margin-bottom: 6px !important;
margin-right: 6px !important;
}
@@ -79,43 +88,35 @@ $generic-text-font-size: $generic-text-font-scale * $v-font-size;
border: 1px solid $widget-border-color;
}
//label to adjust to the layout size and show ellipses on text overflow
.label-style {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
-icab-text-overflow: ellipsis;
-khtml-text-overflow: ellipsis;
-moz-text-overflow: ellipsis;
-webkit-text-overflow: ellipsis;
}
.text-bold {
font-weight: bold !important;
.v-Notification .v-icon {
margin-right: 10px;
vertical-align: middle;
}
.v-Notification-error .v-icon {
color: white;
}
.header-caption-right {
padding-right: 0.5em;
.v-Notification-warning .v-icon {
color: orange;
}
.v-Notification-success .v-icon {
color: green;
}
.avoid-tooltip {
pointer-events: none !important;
}
//This was needed to make the split of prefix "Artifact details of"
//and the actual value "smName:smVersion" in context of the XSS vulnerabilities
//possible after changing ContentMode
//from HTML to TEXT. As no Labels allowed at the windows caption field of the
//artifact details window , decision was made to use the methods
//This was needed to make the split of prefix "Artifact details of" / "Metadata of"
//and the actual value "entityName:entityVersion" in context of the XSS vulnerabilities
//possible after changing ContentMode from HTML to TEXT. As no Labels are allowed
//at the windows caption field, decision was made to use the methods
//Window.setAssistivePrefix() and Window.setAssistivePostfix() to solve the XSS-problem.
//Both, assistive postfix and prefix are usually not visible on the page and only for
//assistive purpose, but with overwriting this third party html class it's a possible
//workaround for the XSS vulnerability. I added a comment in the generic-styles.scss.
//workaround for the XSS vulnerability.
.v-assistive-device-only {
position: static;
top: auto;
@@ -133,8 +134,4 @@ $generic-text-font-size: $generic-text-font-scale * $v-font-size;
.v-table-table {
background: transparent;
}
.rootLayout {
overflow: auto !important;
}
}
}

View File

@@ -7,35 +7,87 @@
* http://www.eclipse.org/legal/epl-v10.html
*/
@mixin grid {
.v-grid-cell.centeralign {
text-align: center;
}
.v-grid-cell.leftalign {
text-align: left;
}
.v-grid-cell.rightalign {
text-align: right;
}
.v-grid-cell {
font-size: $v-font-size--small !important
}
.v-grid-cell.frozen{
box-shadow: none !important;
}
.v-grid-cell.frozen + th {
border-left: $v-grid-border-size solid $widget-border-color ;
}
.v-button-borderless-colored {
color: inherit;
}
.fullSize .v-gridlayout-slot {
height: 100% !important;
}
.v-grid-cell.centeralign {
text-align: center;
}
.v-grid-cell.leftalign {
text-align: left;
}
.v-grid-cell.rightalign {
text-align: right;
}
.v-grid-cell {
font-size: $v-font-size--small !important
}
.v-grid-cell.frozen {
box-shadow: none !important;
}
.v-grid-cell.frozen+th {
border-left: $v-grid-border-size solid $widget-border-color;
}
.v-button-borderless-colored {
color: inherit;
}
.icon-cell {
text-align: center;
}
.fullSize .v-gridlayout-slot {
height: 100% !important;
}
.grid-row-border .v-grid-body tr {
border-top: 1px solid $widget-border-color
}
.grid-row-border .v-grid-body tr:first-child,
.grid-row-border .v-grid-body .v-grid-row-selected {
border-top: none
}
.v-grid-row-selected>.v-grid-cell {
color: #efe7f1;
}
//Row color - installed
.v-grid-row.highlight-green,
.v-grid-row.highlight-green>td,
.v-grid-row.highlight-green .v-grid-cell {
@include valo-gradient($installed-row-color);
}
//Row color - assigned
.v-grid-row.highlight-orange,
.v-grid-row.highlight-orange>td,
.v-grid-row.highlight-orange .v-grid-cell {
@include valo-gradient($assigned-row-color);
}
.multi-selection-grid .v-grid-cell {
user-select: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
-ms-user-select: none;
}
.drag-drop-counter {
padding: 0.2em 0.5em;
background-color: red;
color: white;
border-radius: 0.5em;
font-weight: bold;
position: absolute;
top: -0.5em;
left: -0.5em;
z-index: 14;
}
}

View File

@@ -68,20 +68,20 @@ $menu-title-bg-color: #551f62;
$button-icon-color: #551f62;
//Color of assigned distribution,when target is selected
$installed-row-color: $lighter-orange-color;
//Color of installed distribution,when target is selected
$assigned-row-color: $dark-green-color;
$installed-row-color: $dark-green-color;
//Color of assigned distribution,when target is selected
$assigned-row-color: $lighter-orange-color;
// Background color of accordion caption in confirmation popup
$accordion-action-history-title-color: #551f62;
//Success icon color on valid target filter query
$success-icon-color: #ff0000;
$success-icon-color: #008000;
//Error icon color on invalid target filter query
$error-icon-color: #008000;
$error-icon-color: #ff0000;
//Font style of view caption
$view-caption-font-style: 400 1.6em "Open Sans", sans-serif;

View File

@@ -10,7 +10,8 @@
@mixin others {
//Style to display the pending action count
.unread, .error-count {
.unread,
.error-count {
@include valo-badge-style;
position: absolute;
pointer-events: none;
@@ -21,14 +22,14 @@
border-radius: $v-border-radius;
color: $widget-bg;
}
.error-count {
.error-count {
top: round($v-unit-size / -5);
right: round($v-unit-size / 1.9);
}
.error-count-color{
@include valo-gradient($color: $red-color);
.error-count-color {
@include valo-gradient($color: $red-color);
}
//Deployment view - Style of count message
@@ -50,12 +51,12 @@
//Deployment view information message - Color of assigned count
.assigned-count-message {
color: $installed-row-color;
color: $assigned-row-color;
}
//Deployment view information message - Color of installed count
.installed-count-message {
color: $assigned-row-color;
color: $installed-row-color;
}
//Create distribution twin table - Check box style
@@ -96,10 +97,6 @@
color: $hawkbit-primary-color !important;
}
.icon-only {
margin-bottom: 6px !important;
}
//Toggle between pin and status icon
.v-button-targetStatusPinToggle:after {
font-family: FontAwesome;
@@ -109,92 +106,22 @@
color: $signal-red-color;
}
.v-button-statusIconRed:after {
content: "\f06a";
}
tr:not(.v-selected):hover .v-button-statusIconRed:after {
content: "\f08d";
color: $hawkbit-primary-color;
}
tr.v-selected:hover .v-button-statusIconRed:after {
content: "\f08d";
color: $widget-bg;
}
.statusIconBlue {
color: $status-unknown-color;
}
.v-button-statusIconBlue:after {
content: "\f059";
}
tr:not(.v-selected):hover .v-button-statusIconBlue:after {
content: "\f08d";
color: $hawkbit-primary-color;
}
tr.v-selected:hover .v-button-statusIconBlue:after {
content: "\f08d";
color: $widget-bg;
}
.statusIconYellow {
color: $signal-yellow-color;
}
.v-button-statusIconYellow:after {
content: "\f042";
}
tr:not(.v-selected):hover .v-button-statusIconYellow:after {
content: "\f08d";
color: $hawkbit-primary-color;
}
tr.v-selected:hover .v-button-statusIconYellow:after {
content: "\f08d";
color: $widget-bg;
}
.statusIconGreen {
color: $signal-green-color;
}
.v-button-statusIconGreen:after {
content: "\f058";
}
tr:not(.v-selected):hover .v-button-statusIconGreen:after {
content: "\f08d";
color: $hawkbit-primary-color;
}
tr.v-selected:hover .v-button-statusIconGreen:after {
content: "\f08d";
color: $widget-bg;
}
.statusIconLightBlue {
color: $signal-light-blue-color;
}
.v-button-statusIconLightBlue:after {
content: "\f192";
}
tr:not(.v-selected):hover .v-button-statusIconLightBlue:after {
content: "\f08d";
color: $hawkbit-primary-color;
}
tr.v-selected:hover .v-button-statusIconLightBlue:after {
content: "\f08d";
color: $widget-bg;
}
// pending status label not selected
tr:not(.v-selected) .statusIconForced:after {
color: $hawkbit-primary-color;
@@ -204,7 +131,7 @@
tr.v-selected .statusIconForced:after {
color: $widget-bg;
}
// pending status label not selected
tr:not(.v-selected) .statusIconPending:after {
color: $hawkbit-primary-color;
@@ -214,19 +141,19 @@
tr.v-selected .statusIconPending:after {
color: $widget-bg;
}
// active status label not selected
tr:not(.v-grid-row-selected) .statusIconActive {
@include valo-spinner($size:16px,$speed:1200ms);
@include valo-spinner($size:16px, $speed:1200ms);
color: $hawkbit-primary-color;
}
// active status label selected
tr.v-grid-row-selected .statusIconActive {
@include valo-spinner($size:16px,$speed:1200ms,$color: $grey-light);
@include valo-spinner($size:16px, $speed:1200ms, $color: $grey-light);
color: $grey-light;
}
// neutral status label not selected
tr:not(.v-selected) .statusIconNeutral:after {
color: $hawkbit-primary-color;
@@ -236,7 +163,7 @@
tr.v-selected .statusIconNeutral:after {
color: $widget-bg;
}
// red status label not selected
tr:not(.v-selected) .borderless.statusIconRed:after {
color: $hawkbit-primary-color;
@@ -248,29 +175,30 @@
color: $widget-bg;
content: '';
}
.redSpinner{
@include valo-spinner($size: $v-font-size--small,$color: $red-color);
pointer-events: auto !important;
}
.greySpinner{
@include valo-spinner($size: $v-font-size--small,$color: $grey-color);
pointer-events: auto !important;
}
.yellowSpinner{
@include valo-spinner($size: $v-font-size--small,$color: $signal-yellow-color);
pointer-events: auto !important;
}
.blueSpinner{
@include valo-spinner($size: $v-font-size--small,$color: $signal-light-blue-color);
pointer-events: auto !important;
}
.redSpinner {
@include valo-spinner($size: $v-font-size--small, $color: $red-color);
pointer-events: auto !important;
}
.greySpinner {
@include valo-spinner($size: $v-font-size--small, $color: $grey-color);
pointer-events: auto !important;
}
.yellowSpinner {
@include valo-spinner($size: $v-font-size--small, $color: $signal-yellow-color);
pointer-events: auto !important;
}
.blueSpinner {
@include valo-spinner($size: $v-font-size--small, $color: $signal-light-blue-color);
pointer-events: auto !important;
}
// Disabled row style when distribution is incomplete
.v-table-row-incomplete-distribution {
.v-grid-row.incomplete-distribution,
.v-grid-row.incomplete-distribution>.v-grid-cell {
color: $disabled-row-color-grey !important;
}
@@ -279,20 +207,20 @@
padding-right: 10px;
font-weight: 300;
}
.v-tooltip{
max-width:43em;
.v-tooltip {
max-width: 43em;
}
.breadcrumbPaddingLeft{
padding-left: 3px !important;
.breadcrumbPaddingLeft {
padding-left: 3px !important;
}
.app-loading {
background-position: bottom;
background-position: bottom;
background-repeat: no-repeat;
}
}
.app-loading:before {
background: none;
height: 20px !important;
@@ -315,4 +243,38 @@
margin-left: -10px;
}
}
.bulk-upload-loading:before {
background: none;
height: 18px !important;
width: 18px !important;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
border: 2px solid transparent;
border-top-color: #551f62;
border-right-color: #551f62;
border-radius: 100%;
-webkit-animation: v-rotate-360 500ms infinite linear;
-moz-animation: v-rotate-360 500ms infinite linear;
-ms-animation: v-rotate-360 500ms infinite linear;
-o-animation: v-rotate-360 500ms infinite linear;
animation: v-rotate-360 500ms infinite linear;
pointer-events: none;
}
.rotate-widget-90-deg .v-widget .v-icon{
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
transform: rotate(90deg);
}
.disable-horizontal-scroll {
overflow-x: hidden;
}
.enable-horizontal-scroll {
overflow-x: auto;
}
}

View File

@@ -60,5 +60,8 @@
.metadata-table-margin {
margin-top:3px;
}
.margin-small {
margin:8px;
}
}

View File

@@ -91,9 +91,8 @@
}
.dist-window-maintenance-window-layout {
vertical-align: middle;
horizontal-align: middle;
padding-left: 14px;
vertical-align: middle;
padding-left: 14px;
.v-slot {
vertical-align: middle;
@@ -116,47 +115,6 @@
}
}
///force,soft,time forced radio button styles - start**
.dist-window-actiontype-horz-layout {
padding-bottom: 15px;
.dist-window-forcedtime {
width: 185px;
height: 24px;
}
.v-expand,
.v-slot {
vertical-align: middle;
height: 0;
}
.v-slot {
vertical-align: middle;
padding-left: 8px;
padding-right: 5px;
}
.v-caption {
vertical-align: middle;
}
.v-radiobutton {
padding-right: 0 !important;
margin-right: -15px !important;
}
.v-icon {
color: $hawkbit-primary-color;
}
}
.v-caption-padding-right-style {
padding-right: 25px !important;
padding-left: 0 !important;
}
//force,soft,time forced radio button styles - end
//Target update window specific style, since the label '*Mandatory Field' is
// removed, as controller id is read only********** */
.target-update-window {
@@ -171,34 +129,40 @@
.confirmbox-question-label {
margin: 15px 8px 18px 8px;
}
.bulk-upload-button{
font-size: $v-font-size--small;
height: 38px !important;
.confirmbox-question-label>pre {
margin: 0;
font-family: $app-font-family;
}
.bulk-target-tags-layout{
border-left: 1px solid #bfc3c8;
border-right: 1px solid #bfc3c8;
border-bottom: 1px solid #bfc3c8;
border-radius: 4px;
overflow-y: auto;
.bulk-upload-button {
font-size: $v-font-size--small;
height: 38px !important;
}
.bulk-upload-ds-combo{
margin-top: 2px !important;
}
.v-slot-bulk-upload-label{
line-height:0;
.bulk-target-tags-layout {
border-left: 1px solid #bfc3c8;
border-right: 1px solid #bfc3c8;
border-bottom: 1px solid #bfc3c8;
border-radius: 4px;
overflow-y: auto;
}
.bulk-upload-ds-combo {
margin-top: 2px !important;
}
.v-slot-bulk-upload-label {
line-height: 0;
}
.actionButtonsMargin {
margin-top: 30px;
margin-bottom: 10px;
margin-top: 30px;
margin-bottom: 10px;
}
.v-window-no-closebox .v-window-closebox:before {
.v-window-no-closebox .v-window-closebox:before {
height: 0px !important;
content: "" !important;
}
}
}
}

View File

@@ -7,47 +7,42 @@
* http://www.eclipse.org/legal/epl-v10.html
*/
@mixin statusprogressbar {
.alump-dbar {
.status-bar-part-scheduled {
background-color: $progress-bar-scheduled-part !important;
}
.alump-dbar {
.status-bar-part-running {
background-color: $progress-bar-running-part !important;
}
margin-bottom: 3px;
.status-bar-part-error {
background-color: $progress-bar-error-part !important;
}
.status-bar-part-scheduled {
background-color: $progress-bar-scheduled-part !important;
}
.status-bar-part-finished {
background-color: $progress-bar-finished-part !important;
}
.status-bar-part-running {
background-color: $progress-bar-running-part !important;
}
.status-bar-part-cancelled {
background-color: $progress-bar-cancelled-part !important;
}
.status-bar-part-error {
background-color: $progress-bar-error-part !important;
}
.status-bar-part-notstarted {
background-color: $progress-bar-notstarted-part !important;
}
.alump-dbar-left {
padding: 3px 0px 3px 0px !important;
}
.status-bar-part-finished {
background-color: $progress-bar-finished-part !important;
}
.alump-dbar-middle {
padding: 3px 0px 3px 0px !important;
}
.status-bar-part-cancelled {
background-color: $progress-bar-cancelled-part !important;
}
.alump-dbar-right {
padding: 3px 0px 3px 0px !important;
}
.status-bar-part-notstarted {
background-color: $progress-bar-notstarted-part !important;
}
.alump-dbar-only {
padding: 3px 0px 3px 0px !important;
}
}
.alump-dbar-part {
padding: 0 !important;
height: 100%;
}
.alump-dbar-value {
padding-top: 4px !important;
height: 100% !important;
}
}
}

View File

@@ -45,6 +45,10 @@
color: $button-icon-color;
}
.duration-config-field{
margin-bottom: 10px;
}
}
.durationfield .v-datefield-calendarpanel-header,

View File

@@ -134,11 +134,22 @@
border-bottom-left-radius: 0 !important;
}
//Layout - with no top border
.no-border-top {
border-top: none !important;
border-top-right-radius: 0 !important;
border-top-left-radius: 0 !important;
}
.bordered-layout {
border: 1px solid $widget-border-color;
border-radius: $v-border-radius;
}
.no-stripes .v-grid-row-stripe > td {
background-color: $v-grid-row-background-color;
}
//Table details - tab
.details-tab {
margin: 5px !important;
@@ -151,8 +162,16 @@
//Layout in table details tab
.details-layout {
height: 116px !important;
height: 116px;
padding: 12px;
overflow-y: auto;
overflow-x: auto;
}
.details-description {
padding: 0;
overflow-y: hidden;
overflow-x: hidden;
}
//*Software module table in distribution details tab*
@@ -181,14 +200,16 @@
visibility: hidden;
float: right;
}
.v-button-generatedColumnPadding {
height: 28px;
padding: 0 6px !important;
font-size: 12px;
border-radius: 4px;
}
.metadata-details {
.v-grid-tablewrapper {
border: none;
}
.v-grid-tablewrapper .v-grid-row .v-button{
padding: 0;
}
}
.metadata-grid {
tr {

View File

@@ -13,7 +13,6 @@
.filter-box {
height: 25px !important;
float: right;
visibility: visible;
border-radius: $v-border-radius;
}
@@ -22,10 +21,6 @@
border-radius: $v-border-radius !important;
}
.filter-box-hide {
visibility: hidden;
}
//Search rest icon color
.filter-reset-icon {
color: $red-color;

View File

@@ -12,6 +12,35 @@
//Tag button style
.button-tag-no-border {
color: $tag-text-color !important;
height: auto;
width: 100%;
padding: 0;
font-size: 12px;
text-align: left;
}
//NO_TAG button style
.button-no-tag {
padding-left: 6px;
padding-top: 6px;
}
.button-tag-with-background {
background-color: lightgrey !important;
border-radius: 4px;
height: 28px !important;
margin-top: 6px;
margin-right: 6px;
padding: 0 6px;
.font-icon {
margin-right: 6px;
}
.v-button {
height: auto;
padding: 0;
}
}
.target-tag-clicked,
@@ -40,7 +69,7 @@
color: $widget-caption-color;
}
.v-checkbox > input ~ label:before {
.v-checkbox>input~label:before {
border: 1px solid $twin-table-border-grey;
}
@@ -63,70 +92,42 @@
margin-left: 5px !important;
margin-right: 5px !important;
}
.custom-filter-button{
width:120px !important;
overflow:hidden;
text-overflow:ellipsis;
text-align:left;
.v-menubar-crud-menubar {
line-height: 1.5;
padding: 0;
}
.menubar-position {
margin-top: -5px;
right: 20px;
width: 20px;
.v-menubar-crud-menubar:after {
content: none;
}
.v-menubar-menuitem-tags .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after {
content: none;
.v-menubar-crud-menubar .v-menubar-menuitem {
padding: 0px;
}
.v-menubar-popup .v-menubar-menuitem-menubar-position {
padding-left: 0px;
width: 100px;
right: 0px;
.v-menubar-crud-menubar .v-menubar-menuitem:focus {
outline: none;
}
.v-menubar-submenu-menubar-position {
width: 100px;
right: 0px;
.v-menubar-crud-menubar .v-menubar-submenu-indicator+.v-menubar-menuitem-caption:after {
content: none;
}
.v-menubar-submenu-menubar-position .v-menubar-menuitem {
padding-left: 3px;
.v-menubar-crud-menubar .v-menubar-menuitem-selected {
color: inherit;
background-image: none;
background-color: inherit;
border: none;
box-shadow: none;
text-shadow: none;
}
.v-menubar-borderless .v-menubar-menuitem-selected {
color: inherit;
background-image: none;
background-color: inherit;
.v-menubar-submenu-crud-menubar .v-menubar-menuitem {
padding: 0 20px 0 10px;
}
.v-menubar > .v-menubar-menuitem .v-icon {
margin: 0 4px 0 19px;
.v-menubar-submenu-crud-menubar .v-menubar-menuitem:focus {
outline: none;
}
.v-menubar-borderless .v-menubar-menuitem {
padding: 0px;
}
.v-menubar > .v-menubar-menuitem {
padding: 0px;
}
.targetTag {
right: 19px;
}
#target\.tag\.drop\.area .v-slot-icon-only {
height: 32px;
}
.button-tag-with-background {
background-color: lightgrey !important;
}
.button-assign-tag {
padding-top: 5px;
}
}
}

View File

@@ -41,34 +41,37 @@
}
.caption-header-layout{
padding-left:10px;
.add-update-filter-layout{
margin:10px;
}
.add-update-filter-actions-layout{
margin-bottom:5px;
}
.custom-search-layout{
background-color:#f7fafc;
border:1px solid #bfc3c8;
border-radius:4px;
margin-left:10px;
}
.target-filter-textfield, .target-filter-textfield:focus{
border:none !important;
box-shadow: none !important;
height: 26px !important;
}
.error-icon, .success-icon {
margin-left: 5px;
margin-right: 5px;
}
.error-icon{
margin-left: 5px;
color:$success-icon-color !important;
padding-left:2px !important;
color: $error-icon-color !important;
}
.success-icon{
margin-left: 5px;
color:$error-icon-color !important;
padding-left:2px !important;
color: $success-icon-color !important;
}
.on-focus-no-border:focus::after{

View File

@@ -30,13 +30,13 @@ $v-selection-color: $app-selection-color;
$v-app-background-color: $app-background-color;
//Table header,body border colors are calculated based on this
$v-table-border-color: $widget-border-color ;
$v-table-border-color: $widget-border-color;
$v-grid-border:$v-grid-border-size solid $widget-border-color ;
$v-grid-cell-vertical-border: 0px ;
$v-grid-cell-horizontal-border: 0px ;
$v-grid-cell-focused-border: 0px ;
$v-grid-cell-padding-horizontal:6px;
$v-grid-border:$v-grid-border-size solid $widget-border-color;
$v-grid-cell-vertical-border: 0px;
$v-grid-cell-horizontal-border: 0px;
$v-grid-cell-focused-border: 0px;
$v-grid-cell-padding-horizontal: 6px;
$v-table-row-height: 31px;

View File

@@ -40,11 +40,12 @@ button.auto.assignment.desc = Select auto assign distribution set
button.approve = Approve
button.deny = Deny
button.apply = Apply
bulk.targets.upload = Please upload csv file.
bulkupload.wrong.file.format = Please upload csv file.
bulkupload.ds.name = DS Name
button.discard=Discard
notification.unread.button.title=Notifications
notification.unread.button.description=Notifications ({0} unread)
metadata.link.desc=View {0} Metadata details
# Headers prefix with - header
header.target.table=Targets
@@ -77,6 +78,7 @@ header.action.approve=Approve
header.action.pause=Pause
header.action.update=Edit
header.action.copy=Copy
header.action.download=Download
header.action.delete=Delete
header.status=Status
@@ -98,9 +100,9 @@ distribution.set.tag.updated.event.container.notifcation.message=distribution se
caption.filter.by.type = Filter by type
caption.bulk.upload = Bulk Upload
caption.action.history = Action history
caption.action.history.for = Action history for
caption.action.history.for = Action history for
caption.artifact.details = Artifact Details
caption.artifact.details.of = Artifact Details of
caption.artifact.details.of = Artifact Details of
caption.action.states= Action States
caption.action.messages = Messages
caption.error = Error
@@ -112,15 +114,17 @@ caption.metadata = Metadata
caption.rollout.name = Rollout name
caption.target = Target
caption.target.filter = Target Filter
caption.distribution = Distribution
caption.tag = Tag
caption.type = Type
caption.software.module = Software Module
caption.rollout = Rollout
caption.rollout.approve = Approve Rollout
caption.create.new = Create new {0}
caption.update = Edit {0}
caption.copy = Copy {0}
caption.approve = Approve {0}
caption.select.auto.assign.dist = Select auto assignment distribution set
caption.bulk.upload.targets = Bulk Upload
@@ -159,6 +163,7 @@ caption.maintenancewindow.timezone = Time Zone (from GMT)
# Labels prefix with - label
label.create.filter = Create Filter
label.edit.filter = Edit Filter
label.sign.out = Sign Out
label.menu = Menu
label.active = Active
@@ -169,21 +174,18 @@ label.action.type = Type
label.action.soft = Soft
label.action.downloadonly = Download Only
label.action.time.forced = Time Forced
label.dist.details.type = Type :
label.dist.details.name = Name :
label.dist.details.version = Version :
label.dist.details.vendor = Vendor :
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.name = Name
label.version = Version
label.vendor = Vendor
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
@@ -195,15 +197,16 @@ label.create.type = Create Type
label.update.type = Edit Type
label.singleAssign.type = Firmware (FW)
label.multiAssign.type = Software (SW)
label.singleAssign.type.desc = Allows only one module per distribution set
label.multiAssign.type.desc = Allows multiple modules per distribution set
label.choose.type.color = Type Color
label.choose.tag.color = Tag Color
label.combobox.type = Select Type
label.target.filtered.total = Total Filtered Targets :
label.filter = Filter :
label.target.filter.count = Total Targets :
label.filter.selected = Selected :
label.filter.shown = Shown :
label.filter.targets = Filtered Targets :
label.target.filtered.total = Total Filtered Targets
label.filter = Filter:
label.target.filter.count = Total Targets
label.filter.selected = Selected:
label.filter.shown = Shown:
label.filter.targets = Filtered Targets:
label.filter.status = Status,
label.filter.overdue = Overdue,
label.filter.tags = Tags,
@@ -211,26 +214,14 @@ 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.inactive = In-active
label.finished = Finished
label.notStarted = Not Started
label.error = Error
label.warning = Warning
label.running = Running
label.cancelled = Cancelled
label.cancelling = Canceling
label.retrieved = Retrieved
label.download = Downloading
label.downloaded = Downloaded
label.unknown = Unknown
label.target.id = Controller Id :
label.target.ip = Controller IP :
label.target.security.token = Security token :
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.attributes.update.pending = Update pending..
label.target.lastpolldate = Last poll :
label.target.lastpolldate = Last poll
label.tag.name = Tag name
label.configuration.auth.header = Allow targets to authenticate via a certificate authenticated by a reverse proxy
label.configuration.auth.hashField = SSL Issuer Hash
@@ -250,25 +241,15 @@ label.configuration.repository.multiassignments.notice = Warning: Once this assi
label.unsupported.browser.ie = Sorry! Your 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
label.approval.decision = Approval decision
label.approval.remark = Remark (optional)
label.drop.area.upload = Drop Files to upload
label.errorthreshold.option.percent = %
label.errorthreshold.option.count = Count
label.targetUpdateStatus.unknown = Unknown
label.targetUpdateStatus.in_sync = In Sync
label.targetUpdateStatus.pending = Pending
label.targetUpdateStatus.error = Error
label.targetUpdateStatus.registered = Registered
# 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.query = Query
textfield.key = Key
textfield.version = Version
textfield.vendor = Vendor
@@ -299,6 +280,7 @@ tooltip.check.for.mandatory=Check to make Mandatory
tooltip.artifact.icon=Show Artifact Details
tooltip.click.to.edit = Click to edit
tooltip.click.to.remove = Click to remove
tooltip.click.to.filter = Click to filter
tooltip.metadata.icon = Manage Metadata..
tooltip.next.maintenance.window = next on {0}
tooltip.target.attributes.update.request = Request attributes update
@@ -306,6 +288,24 @@ tooltip.target.attributes.update.requested = Update already requested
tooltip.documentation.link=Documentation
tooltip.artifact.download=Download Artifact
#action status
tooltip.action.status.finished=Finished
tooltip.action.status.error=Error
tooltip.action.status.warning=Warning
tooltip.action.status.running=Running
tooltip.action.status.canceled=Cancelled
tooltip.action.status.canceling=Canceling
tooltip.action.status.retrieved=Retrieved
tooltip.action.status.download=Downloading
tooltip.action.status.downloaded=Downloaded
tooltip.action.status.scheduled=Scheduled
#action active status
tooltip.active.action.status.active=Active
tooltip.active.action.status.scheduled=Scheduled
tooltip.active.action.status.inactive=In-active
tooltip.active.action.status.inactiveerror=In-active Error
#rollout action
tooltip.rollout.run = Run
tooltip.rollout.approve = Approve
@@ -328,6 +328,21 @@ tooltip.rollout.status.finished=Finished
tooltip.rollout.status.deleting=Deleting
tooltip.rollout.status.deleted=Deleted
#rollout group status
tooltip.rollout.group.status.finished=Finished
tooltip.rollout.group.status.scheduled=Scheduled
tooltip.rollout.group.status.running=Running
tooltip.rollout.group.status.ready=Ready
tooltip.rollout.group.status.error=Error
#rollout target status
tooltip.rollout.target.status.finished=Finished
tooltip.rollout.target.status.scheduled=Scheduled
tooltip.rollout.target.status.running=Running
tooltip.rollout.target.status.cancelled=Cancelled
tooltip.rollout.target.status.error=Error
tooltip.rollout.target.status.notstarted=Not Started
tooltip.close = Close
tooltip.search = Search
tooltip.save = Save
@@ -341,7 +356,13 @@ tooltip.selectTag = Select Tag
tooltip.update = Edit..
tooltip.reset = Reset
tooltip.configure = Configure..
tooltip.configure.close = Cancel configure
tooltip.target.status.unknown = Status unknown
tooltip.target.status.error = Status error
tooltip.target.status.in_sync = Status In Sync
tooltip.target.status.pending = Status pending
tooltip.target.status.registered = Status registered
tooltip.target.pin = Pin target
tooltip.distribution.set.pin = Pin distribution set
tooltip.in.time = In Time
@@ -350,21 +371,18 @@ tooltip.in.time = In Time
message.save.success = {0} saved successfully
message.save.fail = {0} could not be saved, possibly due to invalid user input
message.update.success = {0} updated successfully
message.delete.success = {0} deleted successfully
message.delete.success = {0} {1}{2} deleted successfully
message.delete.fail = {0} {1}{2} deletion failed
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 occurred 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.assigned.one = {0} {1} is assigned to {2} {3}
message.assigned.many = {0} {1}s are assigned to {2} {3}
message.unassigned.one = {0} {1} is unassigned from {2} {3}
message.unassigned.many = {0} {1}s are unassigned from {2} {3}
message.alreadyAssigned = {0} {1}s are already assigned to {2} {3}
message.cannot.delete = Cannot be deleted
message.check.softwaremodule = Please provide both name and version!
message.duplicate.softwaremodule = {0} : {1} already exists!
@@ -389,6 +407,7 @@ 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 = Access denied
message.accessdenied.view = No access to view: {0}
message.no.data = No Data
message.data.available = Data available
@@ -396,11 +415,13 @@ 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.duplicate.check = Type with name {0} already exists, please enter another value
message.tag.duplicate.check = Tag with name {0} already exists, please enter another value
message.type.key.ds.duplicate.check = Distribution set type with key {0} already exists, please give another value
message.type.update.mandatory = Please select the Distribution set type to update
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.type.key.empty = You must provide type key
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
@@ -419,6 +440,7 @@ message.target.alreadyAssigned = {0} Target(s) were already assigned
message.force.action = Force
message.force.action.confirm = Are you sure you want to force this action?
message.force.action.success = Action forced successfully !
message.force.action.failed = Unable to force the action !
message.forcequit.action = Force Quit..
message.forcequit.action.success = Action has been force quit successfully !
message.forcequit.action.failed = Force Quitting the action is not possible !
@@ -429,11 +451,15 @@ 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.typenameorkey = Missing Type Name or Key or Software Module type
message.error.missing.typenameorkeyorsmtype = 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.missing.filtername = Please select target filter name
message.error.missing.controllerId = Missing Controller Id
message.error.missing.nameorversion = Missing Name or Version
message.error.missing.nameorversionortype = Missing Name or Version or Type
message.type.delete = Please unclick the type {0}, then try to delete
message.error.dist.set.type.update= Distribution set type is already assigned to set(s) and cannot be changed
message.no.directory.upload = Directory upload is not supported
message.drop.onlyFiles = Please drop files only
@@ -441,19 +467,40 @@ message.delete.filter.confirm = Are you sure 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.filter.query.error.notValide = Target filter query is not valid
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.target.filter.duplicate = Target Filter {0} already exists, please enter another value
message.bulk.upload.upload.started = Uploading a file..
message.bulk.upload.provisioning.started = Provisioning targets..
message.bulk.upload.assignment.started = Assigning tags and DS..
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.
message.maintenancewindow.schedule.required.error = Please provide a Cron expression
message.maintenancewindow.schedule.validation.error = Please enter a valid Cron expression
message.maintenancewindow.duration.required.error = Please provide a duration
message.maintenancewindow.duration.validation.error = Please enter the duration in the format hh:mm:ss, error is at {0} position
message.autoassign.create.error.missingElements = Missing assignment type or distribution set
message.error.nameRequired = Please provide a name
message.error.versionRequired = Please provide a version
message.error.distributionSetRequired = Please provide a distribution set
message.error.tfqRequired = Please provide a target filter
message.error.typeRequired = You must provide the software module type
message.error.noSmTypeSelected = You must select a software module type
message.entity.error.deleted = Entity does no exist. It might have been deleted by an other user.
message.entity.error.readonly = You are not allowed to modify this entity.
message.error.deleteMetaData = No {0} is currently selected or metadata to delete is missing
message.deleted.or.notAllowed = {0} with name {0} was deleted or you are not allowed to update it
message.key.deleted.or.notAllowed = {0} with key {0} was deleted or you are not allowed to update it
message.forcedTime.cannotBeEmpty = Forced time can not be empty
message.forcedTime.missing = Force time is not specified for the time-forced assignment
message.scheduledTime.cannotBeEmpty = Scheduled time can not be empty
# action info
action.target.table.selectall = Select all (Ctrl+A)
action.target.table.clear = Clear selections
action.target.table.clear = Clear selections
action.grid.selection.limit = Selection is limited to {0} entities
#reused messages
soft.module.jvm =Runtime
@@ -468,6 +515,7 @@ message.delete.artifact = Are you sure you want to delete artifact {0} ?
message.swModule.deleted = {0} Software Module(s) deleted
message.error.swModule.notDeleted = Upload is running for Software Module(s)
message.upload.failed = Upload failed
message.upload.failed.with.reason = Upload failed due to {0}
message.upload.assignmentQuota = Max assignments per software module exceeded
message.upload.fileSizeQuota = Maximum artifact size ({0}) exceeded
message.upload.storageQuota = Storage quota exceeded, {0} left
@@ -481,13 +529,17 @@ artifact.upload.progress.caption = Progress
artifact.upload.reason.caption = Reason
artifact.filename.caption = File name
artifact.filesize.bytes.caption = Size(B)
artifact.softwaremodule.type.caption = Type
tooltip.upload.status.inprogress = In progress
tooltip.upload.status.finished = Finished
tooltip.upload.status.failed = Failed
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.sha256 = SHA256 checksum
upload.last.modified.date=Last modified date
upload.failed = Failed
upload.success = Success
@@ -505,7 +557,7 @@ custom.filter.created.by = Created By
custom.created.date = Created Date
#Manage distributions view
label.drop.dist.delete.area = Drop here<br>to delete
label.dist.required.migration.step = Required Migration Step
label.no.tag.assigned = NO TAG
caption.assign.software.dist.accordion.tab = Assign Software Modules
message.software.assignment = {0} Software Module Assignment(s) done
@@ -518,6 +570,7 @@ message.dist.type.delete = Distribution Type deleted successfully.
message.sw.module.type.delete = Software Module Type deleted successfully.
message.dist.type.discard.success = All Distribution Types are discarded successfully !
message.dist.discard.success = All Distributions are discarded successfully !
message.dist.type.notfound = Distribution set type for {0} was not found
message.assign.discard.success = All assignments are discarded successfully !
message.target.ds.assign.success = Assignment saved successfully !
message.target.ds.multiassign.error = Cannot assign multiple distribution sets to a target!
@@ -526,6 +579,8 @@ message.bulk.upload.result.success = Successful: {0}
message.bulk.upload.result.fail = Failed: {0}
message.key.missing = Key is missing !
message.value.missing = Value is missing !
message.metadata.key.required = You must provide metadata key
message.metadata.value.required = You must provide metadata value
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
@@ -568,6 +623,7 @@ configuration.polling.title=Polling Configuration
configuration.polling.time=Polling Time
configuration.polling.overduetime=Polling Overdue Time
configuration.polling.custom.value=use a custom value
configuration.datetime.format.invalid = Input is not in hh:mm:ss/hhmmss format
configuration.rollout.title=Rollout Configuration
configuration.rollout.approval.label=Approve rollout before it can be started
@@ -594,7 +650,6 @@ header.createdBy = Created By
header.createdDate = Created Date
header.modifiedBy = Modified By
header.modifiedDate = Modified Date
header.delete = Delete
header.maintenancewindow = Maintenance Window
header.assigned.ds = Assigned DS
header.installed.ds = Installed DS
@@ -612,6 +667,7 @@ header.approvalRemark = Approval Remark
distribution.details.header = Distribution set
target.details.header = Target
artifact.details.header = Artifact
header.caption.mandatory = Mandatory
header.caption.typename = SoftwareModuleType
header.caption.softwaremodule = SoftwareModule
@@ -626,9 +682,9 @@ header.distributionset = Distribution set
header.numberofgroups = Groups
header.detail.status = Detail status
header.rolloutgroup.installed.percentage = % Finished
header.rolloutgroup.threshold.error = % Error threshold
header.rolloutgroup.threshold = % Trigger threshold
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}
@@ -636,8 +692,10 @@ rollout.group.label.target.truncated = {0} targets has been truncated in the lis
prompt.groups = Groups
prompt.number.of.groups = Number of groups
prompt.tigger.threshold = Trigger threshold
prompt.trigger.threshold = Trigger threshold
prompt.trigger.threshold.required = Trigger threshold is required
prompt.error.threshold = Error threshold
prompt.error.threshold.required = Error threshold is required
prompt.distribution.set = Distribution set
button.rollout.groups.def.button = Define groups
button.rollout.add.group = Add Group
@@ -645,7 +703,8 @@ caption.configure.rollout = Configure Rollout
caption.configure.rollout.groups = Configure Deployment Groups
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.max.group.number = Number of groups must not be greater than 500
message.rollout.target.unassigned = Unassigned
message.rollout.duplicate.check = Rollout [ {0} ] must be unique, entered value already exists.
message.rollout.name.empty = Please enter a name for Rollout
message.correct.invalid.value = Please correct invalid values
@@ -654,13 +713,14 @@ message.rollout.field.value.range = Value should be in range {0} to {1}
message.rollout.filter.target.exists = The selected target filter does not match any existing target
message.rollout.max.group.size.exceeded = The maximum group size of {0} targets is exceeded. Please increase the number of groups or select a different target filter
message.rollout.max.group.size.exceeded.advanced = The maximum size of {0} targets is exceeded for this group. Please re-distribute the targets across the groups and create further groups if needed
message.rollout.approval.required = You should approve or reject the Rollout
message.rollout.started = Rollout {0} started successfully
message.rollout.paused = Rollout {0} paused successfully
message.rollout.resumed = Rollout {0} resumed successfully
message.rollout.deleted = Rollout {0} deleted 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 :
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
@@ -671,6 +731,8 @@ message.delete.rollout.details = There are {0} running updates that will continu
caption.rollout.group.definition.desc = Define which groups the Rollout should have.
header.target.percentage = Target percentage
textfield.target.percentage = Target percentage
textfield.target.percentage.required = Target percentage is required
textfield.target.percentage.format.error = Target percentage format is wrong
textfield.rollout.group.default.name = Group {0}
message.rollout.group.name.invalid = Enter a group name with a length between 1 and 64
caption.rollout.tabs.simple = Number of Groups
@@ -701,13 +763,9 @@ controller.polling.title=Polling Configuration
controller.polling.time=Polling Time
# entity not exist
target.not.exists=Target {0} does not exists. Maybe the target was deleted.
targets.not.exists=Targets does not exists. Maybe the targets was deleted.
rollout.not.exists=Rollout {0} does not exist. Maybe the rollout was deleted.
color.not.exists=There is no mapping for the provided colour {0}
distributionsets.not.exists=Distribution sets do not exists. Maybe the sets were deleted.
message.selected.distributionset.not.found=Distribution set {0} does not exist in the repository, is incomplete or deleted. Please select a new one.
targettag.not.exists=Target tag {0} does not exists. Maybe the target tag was deleted.
caption.entity.target.tag = Target Tag
caption.entity.distribution.tag = Distribution Tag
caption.entity.distribution.type = Distribution set Type
@@ -718,9 +776,7 @@ validator.textfield.min.length = Please enter a text consisting of at least one
caption.entity.delete.action.confirmbox = Confirm Deletion
message.confirm.delete.entity = Are you sure you want to delete {0} {1}{2}?
caption.entity.assign.action.confirmbox = Confirm Assignment
message.confirm.assign.entity = Are you sure you want to assign distribution {0} to {1} {2}?
message.confirm.assign.multiple.entities = Are you sure you want to assign {0} {1} to distribution {2}?
message.confirm.assign.multiple.entities.multiple.distributions = Are you sure you want to assign {0} distributions to {1} {2}?
message.confirm.assign.multiple.entities.to.entity = Are you sure you want to assign {0} {1} to {2} {3}?
# character descriptions
character.whitespace = whitespace