diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/TbRuleEngineProcessingStrategyFactory.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/TbRuleEngineProcessingStrategyFactory.java index b6220f5f94..b42615ad8f 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/TbRuleEngineProcessingStrategyFactory.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/TbRuleEngineProcessingStrategyFactory.java @@ -56,7 +56,9 @@ public class TbRuleEngineProcessingStrategyFactory { private final boolean retryTimeout; private final int maxRetries; private final double maxAllowedFailurePercentage; - private final long pauseBetweenRetries; + private final long maxPauseBetweenRetries; + + private long pauseBetweenRetries; private int initialTotalCount; private int retryCount; @@ -69,6 +71,7 @@ public class TbRuleEngineProcessingStrategyFactory { this.maxRetries = configuration.getRetries(); this.maxAllowedFailurePercentage = configuration.getFailurePercentage(); this.pauseBetweenRetries = configuration.getPauseBetweenRetries(); + this.maxPauseBetweenRetries = configuration.getMaxPauseBetweenRetries(); } @Override @@ -108,6 +111,9 @@ public class TbRuleEngineProcessingStrategyFactory { } catch (InterruptedException e) { throw new RuntimeException(e); } + if (maxPauseBetweenRetries > pauseBetweenRetries) { + pauseBetweenRetries = Math.min(maxPauseBetweenRetries, pauseBetweenRetries * 2); + } } return new TbRuleEngineProcessingDecision(false, toReprocess); } diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 5a44a88879..8e691ba48e 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -765,6 +765,7 @@ queue: retries: "${TB_QUEUE_RE_MAIN_PROCESSING_STRATEGY_RETRIES:3}" # Number of retries, 0 is unlimited failure-percentage: "${TB_QUEUE_RE_MAIN_PROCESSING_STRATEGY_FAILURE_PERCENTAGE:0}" # Skip retry if failures or timeouts are less then X percentage of messages; pause-between-retries: "${TB_QUEUE_RE_MAIN_PROCESSING_STRATEGY_RETRY_PAUSE:3}"# Time in seconds to wait in consumer thread before retries; + max-pause-between-retries: "${TB_QUEUE_RE_MAIN_PROCESSING_STRATEGY_MAX_RETRY_PAUSE:3}"# Max allowed time in seconds for pause between retries. - name: "${TB_QUEUE_RE_HP_QUEUE_NAME:HighPriority}" topic: "${TB_QUEUE_RE_HP_TOPIC:tb_rule_engine.hp}" poll-interval: "${TB_QUEUE_RE_HP_POLL_INTERVAL_MS:25}" @@ -780,6 +781,7 @@ queue: retries: "${TB_QUEUE_RE_HP_PROCESSING_STRATEGY_RETRIES:0}" # Number of retries, 0 is unlimited failure-percentage: "${TB_QUEUE_RE_HP_PROCESSING_STRATEGY_FAILURE_PERCENTAGE:0}" # Skip retry if failures or timeouts are less then X percentage of messages; pause-between-retries: "${TB_QUEUE_RE_HP_PROCESSING_STRATEGY_RETRY_PAUSE:5}"# Time in seconds to wait in consumer thread before retries; + max-pause-between-retries: "${TB_QUEUE_RE_HP_PROCESSING_STRATEGY_MAX_RETRY_PAUSE:5}"# Max allowed time in seconds for pause between retries. - name: "${TB_QUEUE_RE_SQ_QUEUE_NAME:SequentialByOriginator}" topic: "${TB_QUEUE_RE_SQ_TOPIC:tb_rule_engine.sq}" poll-interval: "${TB_QUEUE_RE_SQ_POLL_INTERVAL_MS:25}" @@ -795,6 +797,7 @@ queue: retries: "${TB_QUEUE_RE_SQ_PROCESSING_STRATEGY_RETRIES:3}" # Number of retries, 0 is unlimited failure-percentage: "${TB_QUEUE_RE_SQ_PROCESSING_STRATEGY_FAILURE_PERCENTAGE:0}" # Skip retry if failures or timeouts are less then X percentage of messages; pause-between-retries: "${TB_QUEUE_RE_SQ_PROCESSING_STRATEGY_RETRY_PAUSE:5}"# Time in seconds to wait in consumer thread before retries; + max-pause-between-retries: "${TB_QUEUE_RE_SQ_PROCESSING_STRATEGY_MAX_RETRY_PAUSE:5}"# Max allowed time in seconds for pause between retries. transport: # For high priority notifications that require minimum latency and processing time notifications_topic: "${TB_QUEUE_TRANSPORT_NOTIFICATIONS_TOPIC:tb_transport.notifications}" diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbRuleEngineQueueAckStrategyConfiguration.java b/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbRuleEngineQueueAckStrategyConfiguration.java index 0d21c59c9c..978794662a 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbRuleEngineQueueAckStrategyConfiguration.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbRuleEngineQueueAckStrategyConfiguration.java @@ -24,5 +24,6 @@ public class TbRuleEngineQueueAckStrategyConfiguration { private int retries; private double failurePercentage; private long pauseBetweenRetries; + private long maxPauseBetweenRetries; } diff --git a/ui-ngx/package.json b/ui-ngx/package.json index 9ccabf971e..8011607ea5 100644 --- a/ui-ngx/package.json +++ b/ui-ngx/package.json @@ -54,7 +54,7 @@ "jstree": "^3.3.10", "jstree-bootstrap-theme": "^1.0.1", "jszip": "^3.5.0", - "leaflet": "^1.6.0", + "leaflet": "^1.7.1", "leaflet-editable": "^1.2.0", "leaflet-polylinedecorator": "^1.6.0", "leaflet-providers": "^1.10.2", diff --git a/ui-ngx/src/app/core/api/widget-subscription.ts b/ui-ngx/src/app/core/api/widget-subscription.ts index bb594f0802..9d046bbf83 100644 --- a/ui-ngx/src/app/core/api/widget-subscription.ts +++ b/ui-ngx/src/app/core/api/widget-subscription.ts @@ -1277,7 +1277,7 @@ export class WidgetSubscription implements IWidgetSubscription { const index = startIndex + dataIndex * dataKeysCount + dataKeyIndex; let update = true; let currentData: DataSetHolder; - if (this.displayLegend && this.legendData.keys[index].dataKey.hidden) { + if (this.displayLegend && this.legendData.keys.find(key => key.dataIndex === index).dataKey.hidden) { currentData = this.hiddenData[index]; } else { currentData = this.data[index]; diff --git a/ui-ngx/src/app/core/services/menu.models.ts b/ui-ngx/src/app/core/services/menu.models.ts index f9715b3555..028a0f5380 100644 --- a/ui-ngx/src/app/core/services/menu.models.ts +++ b/ui-ngx/src/app/core/services/menu.models.ts @@ -14,9 +14,11 @@ /// limitations under the License. /// +import { HasUUID } from '@shared/models/id/has-uuid'; + export declare type MenuSectionType = 'link' | 'toggle'; -export class MenuSection { +export interface MenuSection extends HasUUID{ name: string; type: MenuSectionType; path: string; @@ -26,12 +28,12 @@ export class MenuSection { pages?: Array; } -export class HomeSection { +export interface HomeSection { name: string; places: Array; } -export class HomeSectionPlace { +export interface HomeSectionPlace { name: string; icon: string; isMdiIcon?: boolean; diff --git a/ui-ngx/src/app/core/services/menu.service.ts b/ui-ngx/src/app/core/services/menu.service.ts index 2691fc50bb..05477f1ac1 100644 --- a/ui-ngx/src/app/core/services/menu.service.ts +++ b/ui-ngx/src/app/core/services/menu.service.ts @@ -24,6 +24,7 @@ import { HomeSection, MenuSection } from '@core/services/menu.models'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { Authority } from '@shared/models/authority.enum'; import { AuthUser } from '@shared/models/user.model'; +import { guid } from '@core/utils'; @Injectable({ providedIn: 'root' @@ -74,18 +75,21 @@ export class MenuService { const sections: Array = []; sections.push( { + id: guid(), name: 'home.home', type: 'link', path: '/home', icon: 'home' }, { + id: guid(), name: 'tenant.tenants', type: 'link', path: '/tenants', icon: 'supervisor_account' }, { + id: guid(), name: 'tenant-profile.tenant-profiles', type: 'link', path: '/tenantProfiles', @@ -93,12 +97,14 @@ export class MenuService { isMdiIcon: true }, { + id: guid(), name: 'widget.widget-library', type: 'link', path: '/widgets-bundles', icon: 'now_widgets' }, { + id: guid(), name: 'admin.system-settings', type: 'toggle', path: '/settings', @@ -106,18 +112,21 @@ export class MenuService { icon: 'settings', pages: [ { + id: guid(), name: 'admin.general', type: 'link', path: '/settings/general', icon: 'settings_applications' }, { + id: guid(), name: 'admin.outgoing-mail', type: 'link', path: '/settings/outgoing-mail', icon: 'mail' }, { + id: guid(), name: 'admin.security-settings', type: 'link', path: '/settings/security-settings', @@ -186,36 +195,42 @@ export class MenuService { const sections: Array = []; sections.push( { + id: guid(), name: 'home.home', type: 'link', path: '/home', icon: 'home' }, { + id: guid(), name: 'rulechain.rulechains', type: 'link', path: '/ruleChains', icon: 'settings_ethernet' }, { + id: guid(), name: 'customer.customers', type: 'link', path: '/customers', icon: 'supervisor_account' }, { + id: guid(), name: 'asset.assets', type: 'link', path: '/assets', icon: 'domain' }, { + id: guid(), name: 'device.devices', type: 'link', path: '/devices', icon: 'devices_other' }, { + id: guid(), name: 'device-profile.device-profiles', type: 'link', path: '/deviceProfiles', @@ -223,24 +238,28 @@ export class MenuService { isMdiIcon: true }, { + id: guid(), name: 'entity-view.entity-views', type: 'link', path: '/entityViews', icon: 'view_quilt' }, { + id: guid(), name: 'widget.widget-library', type: 'link', path: '/widgets-bundles', icon: 'now_widgets' }, { + id: guid(), name: 'dashboard.dashboards', type: 'link', path: '/dashboards', icon: 'dashboards' }, { + id: guid(), name: 'audit-log.audit-logs', type: 'link', path: '/auditLogs', @@ -342,30 +361,35 @@ export class MenuService { const sections: Array = []; sections.push( { + id: guid(), name: 'home.home', type: 'link', path: '/home', icon: 'home' }, { + id: guid(), name: 'asset.assets', type: 'link', path: '/assets', icon: 'domain' }, { + id: guid(), name: 'device.devices', type: 'link', path: '/devices', icon: 'devices_other' }, { + id: guid(), name: 'entity-view.entity-views', type: 'link', path: '/entityViews', icon: 'view_quilt' }, { + id: guid(), name: 'dashboard.dashboards', type: 'link', path: '/dashboards', diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/leaflet-map.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/leaflet-map.ts index 6bf8fc9ce2..5d6f39850e 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/leaflet-map.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/leaflet-map.ts @@ -86,8 +86,7 @@ export default abstract class LeafletMap { public initSettings(options: MapSettings) { this.options.tinyColor = tinycolor(this.options.color || defaultSettings.color); - const { disableScrollZooming, - useClusterMarkers, + const { useClusterMarkers, zoomOnClick, showCoverageOnHover, removeOutsideVisibleBounds, @@ -95,9 +94,6 @@ export default abstract class LeafletMap { chunkedLoading, maxClusterRadius, maxZoom }: MapSettings = options; - if (disableScrollZooming) { - this.map.scrollWheelZoom.disable(); - } if (useClusterMarkers) { const clusteringSettings: MarkerClusterGroupOptions = { zoomToBoundsOnClick: zoomOnClick, @@ -307,8 +303,11 @@ export default abstract class LeafletMap { } else { this.bounds = new L.LatLngBounds(null, null); } + if (this.options.disableScrollZooming) { + this.map.scrollWheelZoom.disable(); + } if (this.options.draggableMarker) { - this.addMarkerControl(); + this.addMarkerControl(); } if (this.options.editablePolygon) { this.addPolygonControl(); @@ -623,10 +622,10 @@ export default abstract class LeafletMap { // Polyline - updatePolylines(polyData: FormattedData[][], updateBounds = true, data?: FormattedData) { + updatePolylines(polyData: FormattedData[][], updateBounds = true, activePolyline?: FormattedData) { const keys: string[] = []; polyData.forEach((dataSource: FormattedData[]) => { - data = data || dataSource[0]; + const data = activePolyline || dataSource[0]; if (dataSource.length && data.entityName === dataSource[0].entityName) { if (this.polylines.get(data.entityName)) { this.updatePolyline(data, dataSource, this.options, updateBounds); diff --git a/ui-ngx/src/app/modules/home/menu/menu-toggle.component.html b/ui-ngx/src/app/modules/home/menu/menu-toggle.component.html index 4ca7eb8f4c..b8acb0f624 100644 --- a/ui-ngx/src/app/modules/home/menu/menu-toggle.component.html +++ b/ui-ngx/src/app/modules/home/menu/menu-toggle.component.html @@ -24,7 +24,7 @@ [ngClass]="{'tb-toggled' : sectionActive()}">
    -
  • +
diff --git a/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts b/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts index 4054bc4b4f..da1b5d6a42 100644 --- a/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts +++ b/ui-ngx/src/app/modules/home/menu/menu-toggle.component.ts @@ -44,4 +44,8 @@ export class MenuToggleComponent implements OnInit { return '0px'; } } + + trackBySectionPages(index: number, section: MenuSection){ + return section.id; + } } diff --git a/ui-ngx/src/app/modules/home/menu/side-menu.component.html b/ui-ngx/src/app/modules/home/menu/side-menu.component.html index b2302966dd..3819af5777 100644 --- a/ui-ngx/src/app/modules/home/menu/side-menu.component.html +++ b/ui-ngx/src/app/modules/home/menu/side-menu.component.html @@ -16,7 +16,7 @@ -->