Merge pull request #12212 from maxunbearable/fix/debug-settings-ui-fixes
Debug Settings fixes
This commit is contained in:
commit
99cfdab78c
@ -305,7 +305,11 @@ export class ItemBufferService {
|
|||||||
connectors: [],
|
connectors: [],
|
||||||
additionalInfo: origNode.additionalInfo,
|
additionalInfo: origNode.additionalInfo,
|
||||||
configuration: origNode.configuration,
|
configuration: origNode.configuration,
|
||||||
debugMode: origNode.debugMode,
|
debugSettings: {
|
||||||
|
failuresEnabled: origNode.debugSettings?.failuresEnabled,
|
||||||
|
allEnabled: origNode.debugSettings?.allEnabled || origNode.debugSettings?.allEnabledUntil > new Date().getTime(),
|
||||||
|
allEnabledUntil: 0
|
||||||
|
},
|
||||||
x: origNode.x,
|
x: origNode.x,
|
||||||
y: origNode.y,
|
y: origNode.y,
|
||||||
name: origNode.name,
|
name: origNode.name,
|
||||||
|
|||||||
@ -23,10 +23,9 @@
|
|||||||
[disabled]="disabled"
|
[disabled]="disabled"
|
||||||
(click)="openDebugStrategyPanel($event, matButton)">
|
(click)="openDebugStrategyPanel($event, matButton)">
|
||||||
<mat-icon [color]="debugSettingsFormGroup.disabled ? 'inherit' : 'primary'">bug_report</mat-icon>
|
<mat-icon [color]="debugSettingsFormGroup.disabled ? 'inherit' : 'primary'">bug_report</mat-icon>
|
||||||
<span *ngIf="!failuresEnabled && !(isDebugAllActive$ | async)" translate>common.disabled</span>
|
@if (isDebugAllActive$ | async) {
|
||||||
<span *ngIf="(isDebugAllActive$ | async) && failuresEnabled" translate>debug-config.all</span>
|
{{ !allEnabled() ? (allEnabledUntil | durationLeft) : (maxDebugModeDuration | milliSecondsToTimeString: true : true) }}
|
||||||
<span *ngIf="(isDebugAllActive$ | async) && !failuresEnabled">
|
} @else {
|
||||||
{{ !allEnabled ? (allEnabledUntil | durationLeft) : ('debug-config.min' | translate: { number: maxDebugModeDurationMinutes }) }}
|
{{ (failuresEnabled ? 'debug-config.failures' : 'common.disabled') | translate }}
|
||||||
</span>
|
}
|
||||||
<span *ngIf="!(isDebugAllActive$ | async) && failuresEnabled" translate>debug-config.failures</span>
|
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -14,18 +14,27 @@
|
|||||||
/// limitations under the License.
|
/// limitations under the License.
|
||||||
///
|
///
|
||||||
|
|
||||||
import { ChangeDetectionStrategy, Component, forwardRef, Input, Renderer2, ViewContainerRef } from '@angular/core';
|
import {
|
||||||
|
ChangeDetectionStrategy,
|
||||||
|
ChangeDetectorRef,
|
||||||
|
Component,
|
||||||
|
forwardRef,
|
||||||
|
Input,
|
||||||
|
Renderer2,
|
||||||
|
signal,
|
||||||
|
ViewContainerRef
|
||||||
|
} from '@angular/core';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { SharedModule } from '@shared/shared.module';
|
import { SharedModule } from '@shared/shared.module';
|
||||||
import { DurationLeftPipe } from '@shared/pipe/duration-left.pipe';
|
import { DurationLeftPipe } from '@shared/pipe/duration-left.pipe';
|
||||||
import { TbPopoverService } from '@shared/components/popover.service';
|
import { TbPopoverService } from '@shared/components/popover.service';
|
||||||
import { MatButton } from '@angular/material/button';
|
import { MatButton } from '@angular/material/button';
|
||||||
import { DebugSettingsPanelComponent } from './debug-settings-panel.component';
|
import { DebugSettingsPanelComponent } from './debug-settings-panel.component';
|
||||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
||||||
import { of, shareReplay, timer } from 'rxjs';
|
import { of, shareReplay, timer } from 'rxjs';
|
||||||
import { SECOND } from '@shared/models/time/time.models';
|
import { MINUTE, SECOND } from '@shared/models/time/time.models';
|
||||||
import { DebugSettings } from '@shared/models/entity.models';
|
import { DebugSettings } from '@shared/models/entity.models';
|
||||||
import { map, startWith, switchMap, takeWhile } from 'rxjs/operators';
|
import { map, switchMap, takeWhile } from 'rxjs/operators';
|
||||||
import { getCurrentAuthState } from '@core/auth/auth.selectors';
|
import { getCurrentAuthState } from '@core/auth/auth.selectors';
|
||||||
import { AppState } from '@core/core.state';
|
import { AppState } from '@core/core.state';
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
@ -60,11 +69,11 @@ export class DebugSettingsButtonComponent implements ControlValueAccessor {
|
|||||||
});
|
});
|
||||||
|
|
||||||
disabled = false;
|
disabled = false;
|
||||||
|
allEnabled = signal(false);
|
||||||
|
|
||||||
isDebugAllActive$ = this.debugSettingsFormGroup.get('allEnabled').valueChanges.pipe(
|
isDebugAllActive$ = toObservable(this.allEnabled).pipe(
|
||||||
startWith(null),
|
switchMap((value) => {
|
||||||
switchMap(() => {
|
if (value) {
|
||||||
if (this.allEnabled) {
|
|
||||||
return of(true);
|
return of(true);
|
||||||
} else {
|
} else {
|
||||||
return timer(0, SECOND).pipe(
|
return timer(0, SECOND).pipe(
|
||||||
@ -77,7 +86,7 @@ export class DebugSettingsButtonComponent implements ControlValueAccessor {
|
|||||||
shareReplay(1)
|
shareReplay(1)
|
||||||
);
|
);
|
||||||
|
|
||||||
readonly maxDebugModeDurationMinutes = getCurrentAuthState(this.store).maxDebugModeDurationMinutes;
|
readonly maxDebugModeDuration = getCurrentAuthState(this.store).maxDebugModeDurationMinutes * MINUTE;
|
||||||
|
|
||||||
private propagateChange: (settings: DebugSettings) => void = () => {};
|
private propagateChange: (settings: DebugSettings) => void = () => {};
|
||||||
|
|
||||||
@ -86,22 +95,23 @@ export class DebugSettingsButtonComponent implements ControlValueAccessor {
|
|||||||
private store: Store<AppState>,
|
private store: Store<AppState>,
|
||||||
private viewContainerRef: ViewContainerRef,
|
private viewContainerRef: ViewContainerRef,
|
||||||
private fb: FormBuilder,
|
private fb: FormBuilder,
|
||||||
|
private cd : ChangeDetectorRef,
|
||||||
) {
|
) {
|
||||||
this.debugSettingsFormGroup.valueChanges.pipe(
|
this.debugSettingsFormGroup.valueChanges.pipe(
|
||||||
takeUntilDestroyed()
|
takeUntilDestroyed()
|
||||||
).subscribe(value => {
|
).subscribe(value => {
|
||||||
this.propagateChange(value);
|
this.propagateChange(value);
|
||||||
})
|
});
|
||||||
|
|
||||||
|
this.debugSettingsFormGroup.get('allEnabled').valueChanges.pipe(
|
||||||
|
takeUntilDestroyed()
|
||||||
|
).subscribe(value => this.allEnabled.set(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
get failuresEnabled(): boolean {
|
get failuresEnabled(): boolean {
|
||||||
return this.debugSettingsFormGroup.get('failuresEnabled').value;
|
return this.debugSettingsFormGroup.get('failuresEnabled').value;
|
||||||
}
|
}
|
||||||
|
|
||||||
get allEnabled(): boolean {
|
|
||||||
return this.debugSettingsFormGroup.get('allEnabled').value;
|
|
||||||
}
|
|
||||||
|
|
||||||
get allEnabledUntil(): number {
|
get allEnabledUntil(): number {
|
||||||
return this.debugSettingsFormGroup.get('allEnabledUntil').value;
|
return this.debugSettingsFormGroup.get('allEnabledUntil').value;
|
||||||
}
|
}
|
||||||
@ -120,7 +130,7 @@ export class DebugSettingsButtonComponent implements ControlValueAccessor {
|
|||||||
this.viewContainerRef, DebugSettingsPanelComponent, 'bottom', true, null,
|
this.viewContainerRef, DebugSettingsPanelComponent, 'bottom', true, null,
|
||||||
{
|
{
|
||||||
...debugSettings,
|
...debugSettings,
|
||||||
maxDebugModeDurationMinutes: this.maxDebugModeDurationMinutes,
|
maxDebugModeDuration: this.maxDebugModeDuration,
|
||||||
debugLimitsConfiguration: this.debugLimitsConfiguration
|
debugLimitsConfiguration: this.debugLimitsConfiguration
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
@ -128,6 +138,7 @@ export class DebugSettingsButtonComponent implements ControlValueAccessor {
|
|||||||
debugStrategyPopover.tbComponentRef.instance.popover = debugStrategyPopover;
|
debugStrategyPopover.tbComponentRef.instance.popover = debugStrategyPopover;
|
||||||
debugStrategyPopover.tbComponentRef.instance.onSettingsApplied.subscribe((settings: DebugSettings) => {
|
debugStrategyPopover.tbComponentRef.instance.onSettingsApplied.subscribe((settings: DebugSettings) => {
|
||||||
this.debugSettingsFormGroup.patchValue(settings);
|
this.debugSettingsFormGroup.patchValue(settings);
|
||||||
|
this.cd.markForCheck();
|
||||||
debugStrategyPopover.hide();
|
debugStrategyPopover.hide();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -141,6 +152,7 @@ export class DebugSettingsButtonComponent implements ControlValueAccessor {
|
|||||||
|
|
||||||
writeValue(settings: DebugSettings): void {
|
writeValue(settings: DebugSettings): void {
|
||||||
this.debugSettingsFormGroup.patchValue(settings, {emitEvent: false});
|
this.debugSettingsFormGroup.patchValue(settings, {emitEvent: false});
|
||||||
|
this.allEnabled.set(settings?.allEnabled);
|
||||||
this.debugSettingsFormGroup.get('allEnabled').updateValueAndValidity({onlySelf: true});
|
this.debugSettingsFormGroup.get('allEnabled').updateValueAndValidity({onlySelf: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<div class="hint-container">
|
<div class="hint-container">
|
||||||
<div class="tb-form-hint tb-primary-fill tb-flex center">
|
<div class="tb-form-hint tb-primary-fill tb-flex center">
|
||||||
@if (debugLimitsConfiguration) {
|
@if (debugLimitsConfiguration) {
|
||||||
{{ 'debug-config.hint.main-limited' | translate: { msg: maxMessagesCount, sec: maxTimeFrameSec } }}
|
{{ 'debug-config.hint.main-limited' | translate: { msg: maxMessagesCount, time: (maxTimeFrameDuration | milliSecondsToTimeString: true : true) } }}
|
||||||
} @else {
|
} @else {
|
||||||
{{ 'debug-config.hint.main' | translate }}
|
{{ 'debug-config.hint.main' | translate }}
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@
|
|||||||
<div class="align-center flex justify-between">
|
<div class="align-center flex justify-between">
|
||||||
<mat-slide-toggle class="mat-slide" [formControl]="debugAllControl">
|
<mat-slide-toggle class="mat-slide" [formControl]="debugAllControl">
|
||||||
<div tb-hint-tooltip-icon="{{ 'debug-config.hint.all-messages' | translate }}">
|
<div tb-hint-tooltip-icon="{{ 'debug-config.hint.all-messages' | translate }}">
|
||||||
{{ 'debug-config.all-messages' | translate: { time: (isDebugAllActive$ | async) && !allEnabled ? (allEnabledUntil | durationLeft) : ('debug-config.min' | translate: { number: maxDebugModeDurationMinutes }) } }}
|
{{ 'debug-config.all-messages' | translate: { time: (isDebugAllActive$ | async) && !allEnabled ? (allEnabledUntil | durationLeft) : (maxDebugModeDuration | milliSecondsToTimeString: true : true) } }}
|
||||||
</div>
|
</div>
|
||||||
</mat-slide-toggle>
|
</mat-slide-toggle>
|
||||||
<button mat-icon-button *ngIf="(isDebugAllActive$ | async) && !allEnabled"
|
<button mat-icon-button *ngIf="(isDebugAllActive$ | async) && !allEnabled"
|
||||||
@ -58,6 +58,7 @@
|
|||||||
<button mat-raised-button
|
<button mat-raised-button
|
||||||
color="primary"
|
color="primary"
|
||||||
type="button"
|
type="button"
|
||||||
|
[disabled]="(isLoading$ | async) || !onFailuresControl.dirty && !debugAllControl.dirty"
|
||||||
(click)="onApply()">
|
(click)="onApply()">
|
||||||
{{ 'action.apply' | translate }}
|
{{ 'action.apply' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -52,14 +52,14 @@ export class DebugSettingsPanelComponent extends PageComponent implements OnInit
|
|||||||
@Input({ transform: booleanAttribute }) failuresEnabled = false;
|
@Input({ transform: booleanAttribute }) failuresEnabled = false;
|
||||||
@Input({ transform: booleanAttribute }) allEnabled = false;
|
@Input({ transform: booleanAttribute }) allEnabled = false;
|
||||||
@Input() allEnabledUntil = 0;
|
@Input() allEnabledUntil = 0;
|
||||||
@Input() maxDebugModeDurationMinutes: number;
|
@Input() maxDebugModeDuration: number;
|
||||||
@Input() debugLimitsConfiguration: string;
|
@Input() debugLimitsConfiguration: string;
|
||||||
|
|
||||||
onFailuresControl = this.fb.control(false);
|
onFailuresControl = this.fb.control(false);
|
||||||
debugAllControl = this.fb.control(false);
|
debugAllControl = this.fb.control(false);
|
||||||
|
|
||||||
maxMessagesCount: string;
|
maxMessagesCount: string;
|
||||||
maxTimeFrameSec: string;
|
maxTimeFrameDuration: number;
|
||||||
initialAllEnabled: boolean;
|
initialAllEnabled: boolean;
|
||||||
|
|
||||||
isDebugAllActive$ = this.debugAllControl.valueChanges.pipe(
|
isDebugAllActive$ = this.debugAllControl.valueChanges.pipe(
|
||||||
@ -99,7 +99,7 @@ export class DebugSettingsPanelComponent extends PageComponent implements OnInit
|
|||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.maxMessagesCount = this.debugLimitsConfiguration?.split(':')[0];
|
this.maxMessagesCount = this.debugLimitsConfiguration?.split(':')[0];
|
||||||
this.maxTimeFrameSec = this.debugLimitsConfiguration?.split(':')[1];
|
this.maxTimeFrameDuration = parseInt(this.debugLimitsConfiguration?.split(':')[1]) * SECOND;
|
||||||
this.onFailuresControl.patchValue(this.failuresEnabled);
|
this.onFailuresControl.patchValue(this.failuresEnabled);
|
||||||
this.debugAllControl.patchValue(this.allEnabled);
|
this.debugAllControl.patchValue(this.allEnabled);
|
||||||
this.initialAllEnabled = this.allEnabled || this.allEnabledUntil > new Date().getTime();
|
this.initialAllEnabled = this.allEnabled || this.allEnabledUntil > new Date().getTime();
|
||||||
@ -128,6 +128,7 @@ export class DebugSettingsPanelComponent extends PageComponent implements OnInit
|
|||||||
|
|
||||||
onReset(): void {
|
onReset(): void {
|
||||||
this.debugAllControl.patchValue(true);
|
this.debugAllControl.patchValue(true);
|
||||||
|
this.debugAllControl.markAsDirty();
|
||||||
this.allEnabledUntil = 0;
|
this.allEnabledUntil = 0;
|
||||||
this.cd.markForCheck();
|
this.cd.markForCheck();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -239,10 +239,10 @@
|
|||||||
matTooltipPosition="above">
|
matTooltipPosition="above">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<button [disabled]="(isLoading$ | async) || !isDebugModeEnabled()"
|
<button [disabled]="(isLoading$ | async) || !isDebugSettingsEnabled()"
|
||||||
mat-fab color="accent" class="tb-btn-footer"
|
mat-fab color="accent" class="tb-btn-footer"
|
||||||
(click)="resetDebugModeInAllNodes()"
|
(click)="resetDebugSettingsInAllNodes()"
|
||||||
matTooltip="{{ 'rulenode.reset-debug-mode' | translate }}"
|
matTooltip="{{ 'rulenode.reset-debug-settings' | translate }}"
|
||||||
matTooltipPosition="above">
|
matTooltipPosition="above">
|
||||||
<mat-icon>bug_report</mat-icon>
|
<mat-icon>bug_report</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -95,6 +95,7 @@ import { ComponentClusteringMode } from '@shared/models/component-descriptor.mod
|
|||||||
import { MatDrawer } from '@angular/material/sidenav';
|
import { MatDrawer } from '@angular/material/sidenav';
|
||||||
import { HttpStatusCode } from '@angular/common/http';
|
import { HttpStatusCode } from '@angular/common/http';
|
||||||
import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
|
import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
|
||||||
|
import { DebugSettings } from '@shared/models/entity.models';
|
||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -1415,17 +1416,20 @@ export class RuleChainPageComponent extends PageComponent
|
|||||||
this.ruleChainCanvas.modelService.deleteSelected();
|
this.ruleChainCanvas.modelService.deleteSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
isDebugModeEnabled(): boolean {
|
isDebugSettingsEnabled(): boolean {
|
||||||
const res = this.ruleChainModel.nodes.find((node) => node.debugMode);
|
const res = this.ruleChainModel.nodes.find((node) => node?.debugSettings && this.isDebugSettingsActive(node.debugSettings));
|
||||||
return typeof res !== 'undefined';
|
return typeof res !== 'undefined';
|
||||||
}
|
}
|
||||||
|
|
||||||
resetDebugModeInAllNodes() {
|
resetDebugSettingsInAllNodes(): void {
|
||||||
let changed = false;
|
let changed = false;
|
||||||
this.ruleChainModel.nodes.forEach((node) => {
|
this.ruleChainModel.nodes.forEach((node) => {
|
||||||
if (node.component.type !== RuleNodeType.INPUT) {
|
if (node.component.type !== RuleNodeType.INPUT) {
|
||||||
changed = changed || node.debugMode;
|
const nodeHasActiveDebugSettings = node?.debugSettings && this.isDebugSettingsActive(node.debugSettings);
|
||||||
node.debugMode = false;
|
changed = changed || nodeHasActiveDebugSettings;
|
||||||
|
if (nodeHasActiveDebugSettings) {
|
||||||
|
node.debugSettings = { allEnabled: false, failuresEnabled: false, allEnabledUntil: 0 };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (changed) {
|
if (changed) {
|
||||||
@ -1433,6 +1437,10 @@ export class RuleChainPageComponent extends PageComponent
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isDebugSettingsActive(debugSettings: DebugSettings): boolean {
|
||||||
|
return debugSettings.allEnabled || debugSettings.failuresEnabled || debugSettings.allEnabledUntil > new Date().getTime();
|
||||||
|
}
|
||||||
|
|
||||||
validate() {
|
validate() {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.isInvalid = false;
|
this.isInvalid = false;
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
import { Pipe, PipeTransform } from '@angular/core';
|
import { Pipe, PipeTransform } from '@angular/core';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { DAY, HOUR, MINUTE, SECOND } from '@shared/models/time/time.models';
|
import { DAY, HOUR, MINUTE, SECOND, YEAR } from '@shared/models/time/time.models';
|
||||||
|
|
||||||
@Pipe({
|
@Pipe({
|
||||||
name: 'milliSecondsToTimeString'
|
name: 'milliSecondsToTimeString'
|
||||||
@ -27,19 +27,21 @@ export class MillisecondsToTimeStringPipe implements PipeTransform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
transform(milliSeconds: number, shortFormat = false, onlyFirstDigit = false): string {
|
transform(milliSeconds: number, shortFormat = false, onlyFirstDigit = false): string {
|
||||||
const { days, hours, minutes, seconds } = this.extractTimeUnits(milliSeconds);
|
const { years, days, hours, minutes, seconds } = this.extractTimeUnits(milliSeconds);
|
||||||
return this.formatTimeString(days, hours, minutes, seconds, shortFormat, onlyFirstDigit);
|
return this.formatTimeString(years, days, hours, minutes, seconds, shortFormat, onlyFirstDigit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private extractTimeUnits(milliseconds: number): { days: number; hours: number; minutes: number; seconds: number } {
|
private extractTimeUnits(milliseconds: number): { years: number; days: number; hours: number; minutes: number; seconds: number } {
|
||||||
const days = Math.floor(milliseconds / DAY);
|
const years = Math.floor(milliseconds / YEAR);
|
||||||
|
const days = Math.floor((milliseconds % YEAR) / DAY);
|
||||||
const hours = Math.floor((milliseconds % DAY) / HOUR);
|
const hours = Math.floor((milliseconds % DAY) / HOUR);
|
||||||
const minutes = Math.floor((milliseconds % HOUR) / MINUTE);
|
const minutes = Math.floor((milliseconds % HOUR) / MINUTE);
|
||||||
const seconds = Math.floor((milliseconds % MINUTE) / SECOND);
|
const seconds = Math.floor((milliseconds % MINUTE) / SECOND);
|
||||||
return { days, hours, minutes, seconds };
|
return { years, days, hours, minutes, seconds };
|
||||||
}
|
}
|
||||||
|
|
||||||
private formatTimeString(
|
private formatTimeString(
|
||||||
|
years: number,
|
||||||
days: number,
|
days: number,
|
||||||
hours: number,
|
hours: number,
|
||||||
minutes: number,
|
minutes: number,
|
||||||
@ -48,6 +50,7 @@ export class MillisecondsToTimeStringPipe implements PipeTransform {
|
|||||||
onlyFirstDigit: boolean
|
onlyFirstDigit: boolean
|
||||||
): string {
|
): string {
|
||||||
const timeUnits = [
|
const timeUnits = [
|
||||||
|
{ value: years, key: 'years', shortKey: 'short.years' },
|
||||||
{ value: days, key: 'days', shortKey: 'short.days' },
|
{ value: days, key: 'days', shortKey: 'short.days' },
|
||||||
{ value: hours, key: 'hours', shortKey: 'short.hours' },
|
{ value: hours, key: 'hours', shortKey: 'short.hours' },
|
||||||
{ value: minutes, key: 'minutes', shortKey: 'short.minutes' },
|
{ value: minutes, key: 'minutes', shortKey: 'short.minutes' },
|
||||||
@ -59,7 +62,7 @@ export class MillisecondsToTimeStringPipe implements PipeTransform {
|
|||||||
if (value > 0) {
|
if (value > 0) {
|
||||||
timeString += this.translate.instant(shortFormat ? `timewindow.${shortKey}` : `timewindow.${key}`, { [key]: value });
|
timeString += this.translate.instant(shortFormat ? `timewindow.${shortKey}` : `timewindow.${key}`, { [key]: value });
|
||||||
if (onlyFirstDigit) {
|
if (onlyFirstDigit) {
|
||||||
return timeString;
|
return timeString.trim();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4602,7 +4602,6 @@
|
|||||||
"output": "الإخراج",
|
"output": "الإخراج",
|
||||||
"test": "اختبار",
|
"test": "اختبار",
|
||||||
"help": "مساعدة",
|
"help": "مساعدة",
|
||||||
"reset-debug-mode": "إعادة تعيين وضع التصحيح في جميع العقد",
|
|
||||||
"test-with-this-message": "{{test}} مع هذه الرسالة"
|
"test-with-this-message": "{{test}} مع هذه الرسالة"
|
||||||
},
|
},
|
||||||
"role": {
|
"role": {
|
||||||
|
|||||||
@ -3651,8 +3651,7 @@
|
|||||||
"metadata-required": "Les entrades de metadades no poden estar buides.",
|
"metadata-required": "Les entrades de metadades no poden estar buides.",
|
||||||
"output": "Sortida",
|
"output": "Sortida",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Ajuda",
|
"help": "Ajuda"
|
||||||
"reset-debug-mode": "Restablir el mode de depuració a tots els nodes"
|
|
||||||
},
|
},
|
||||||
"role": {
|
"role": {
|
||||||
"role": "Rol",
|
"role": "Rol",
|
||||||
|
|||||||
@ -2426,8 +2426,7 @@
|
|||||||
"metadata-required": "Záznam metadat nemůže být prázdný.",
|
"metadata-required": "Záznam metadat nemůže být prázdný.",
|
||||||
"output": "Výstup",
|
"output": "Výstup",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Nápověda",
|
"help": "Nápověda"
|
||||||
"reset-debug-mode": "Resetovat režim ladění na všech uzlech"
|
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
"timezone": "Časová zóna",
|
"timezone": "Časová zóna",
|
||||||
|
|||||||
@ -2642,8 +2642,7 @@
|
|||||||
"metadata-required": "Metadataposter må ikke være tomme.",
|
"metadata-required": "Metadataposter må ikke være tomme.",
|
||||||
"output": "Output",
|
"output": "Output",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Hjælp",
|
"help": "Hjælp"
|
||||||
"reset-debug-mode": "Nulstil debug-tilstand i alle knuder"
|
|
||||||
},
|
},
|
||||||
"role": {
|
"role": {
|
||||||
"role": "Rolle",
|
"role": "Rolle",
|
||||||
|
|||||||
@ -1886,8 +1886,7 @@
|
|||||||
"metadata-required": "Οι καταχωρίσεις μεταδεδομένων δεν μπορούν να είναι κενές.",
|
"metadata-required": "Οι καταχωρίσεις μεταδεδομένων δεν μπορούν να είναι κενές.",
|
||||||
"output": "Απόδοση",
|
"output": "Απόδοση",
|
||||||
"test": "Τεστ",
|
"test": "Τεστ",
|
||||||
"help": "Βοήθεια",
|
"help": "Βοήθεια"
|
||||||
"reset-debug-mode": "Επαναφορά λειτουργίας εντοπισμού σφαλμάτων σε όλους τους κόμβους"
|
|
||||||
},
|
},
|
||||||
"role": {
|
"role": {
|
||||||
"role": "Ρόλος",
|
"role": "Ρόλος",
|
||||||
|
|||||||
@ -990,15 +990,13 @@
|
|||||||
"type-sms-sent": "SMS sent"
|
"type-sms-sent": "SMS sent"
|
||||||
},
|
},
|
||||||
"debug-config": {
|
"debug-config": {
|
||||||
"min": "{{number}} min",
|
|
||||||
"label": "Debug configuration",
|
"label": "Debug configuration",
|
||||||
"on-failure": "Failures only (24/7)",
|
"on-failure": "Failures only (24/7)",
|
||||||
"all-messages": "All messages ({{time}})",
|
"all-messages": "All messages ({{time}})",
|
||||||
"failures": "Failures",
|
"failures": "Failures",
|
||||||
"all": "All",
|
|
||||||
"hint": {
|
"hint": {
|
||||||
"main": "All node debug messages rate limited with:",
|
"main": "All node debug messages rate limited with:",
|
||||||
"main-limited": "All node debug messages will be rate-limited, with a maximum of {{msg}} messages allowed per {{sec}} seconds.",
|
"main-limited": "All node debug messages will be rate-limited, with a maximum of {{msg}} messages allowed per {{time}}.",
|
||||||
"on-failure": "Save all failure debug events without time limit.",
|
"on-failure": "Save all failure debug events without time limit.",
|
||||||
"all-messages": "Save all debug events during time limit."
|
"all-messages": "Save all debug events during time limit."
|
||||||
}
|
}
|
||||||
@ -4295,7 +4293,7 @@
|
|||||||
"output": "Output",
|
"output": "Output",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Help",
|
"help": "Help",
|
||||||
"reset-debug-mode": "Reset debug mode in all nodes",
|
"reset-debug-settings": "Reset debug settings in all nodes",
|
||||||
"test-with-this-message": "{{test}} with this message",
|
"test-with-this-message": "{{test}} with this message",
|
||||||
"queue-hint": "Select a queue for message forwarding to another queue. 'Main' queue is used by default.",
|
"queue-hint": "Select a queue for message forwarding to another queue. 'Main' queue is used by default.",
|
||||||
"queue-singleton-hint": "Select a queue for message forwarding in multi-instance environments. 'Main' queue is used by default."
|
"queue-singleton-hint": "Select a queue for message forwarding in multi-instance environments. 'Main' queue is used by default."
|
||||||
@ -4745,6 +4743,7 @@
|
|||||||
"sec": "{{ sec }} sec",
|
"sec": "{{ sec }} sec",
|
||||||
"sec-short": "{{ sec }}s",
|
"sec-short": "{{ sec }}s",
|
||||||
"short": {
|
"short": {
|
||||||
|
"years": "{ years, plural, =1 {1 year } other {# years } }",
|
||||||
"days": "{ days, plural, =1 {1 day } other {# days } }",
|
"days": "{ days, plural, =1 {1 day } other {# days } }",
|
||||||
"hours": "{ hours, plural, =1 {1 hour } other {# hours } }",
|
"hours": "{ hours, plural, =1 {1 hour } other {# hours } }",
|
||||||
"minutes": "{{minutes}} min ",
|
"minutes": "{{minutes}} min ",
|
||||||
|
|||||||
@ -3529,7 +3529,6 @@
|
|||||||
"output": "Salida",
|
"output": "Salida",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Ayuda",
|
"help": "Ayuda",
|
||||||
"reset-debug-mode": "Restablecer el modo de depuración en todos los nodos",
|
|
||||||
"test-with-this-message": "{{test}} con este mensaje"
|
"test-with-this-message": "{{test}} con este mensaje"
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
|
|||||||
@ -1413,8 +1413,7 @@
|
|||||||
"metadata-required": "მეტამონაცემები ვერ იქნება ცარიელი",
|
"metadata-required": "მეტამონაცემები ვერ იქნება ცარიელი",
|
||||||
"output": "რეზულტატი",
|
"output": "რეზულტატი",
|
||||||
"test": "ტესტი",
|
"test": "ტესტი",
|
||||||
"help": "დახმარება",
|
"help": "დახმარება"
|
||||||
"reset-debug-mode": "Debug რეჟიმის გათიშვა ყველა ნოდისთვის"
|
|
||||||
},
|
},
|
||||||
"tenant": {
|
"tenant": {
|
||||||
"tenant": "ტენანტი",
|
"tenant": "ტენანტი",
|
||||||
|
|||||||
@ -1878,8 +1878,7 @@
|
|||||||
"metadata-required": "메타데이터 엔트리를 입력하세요.",
|
"metadata-required": "메타데이터 엔트리를 입력하세요.",
|
||||||
"output": "출력",
|
"output": "출력",
|
||||||
"test": "테스트",
|
"test": "테스트",
|
||||||
"help": "도움말",
|
"help": "도움말"
|
||||||
"reset-debug-mode": "모든 노드에 대해 디버그 모드 초기화"
|
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
"timezone": "Timezone",
|
"timezone": "Timezone",
|
||||||
|
|||||||
@ -4504,7 +4504,6 @@
|
|||||||
"output": "Output",
|
"output": "Output",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Help",
|
"help": "Help",
|
||||||
"reset-debug-mode": "Reset debug mode in all nodes",
|
|
||||||
"test-with-this-message": "{{test}} with this message"
|
"test-with-this-message": "{{test}} with this message"
|
||||||
},
|
},
|
||||||
"role": {
|
"role": {
|
||||||
|
|||||||
@ -1338,8 +1338,7 @@
|
|||||||
"metadata-required": "Metadatu ievadi nevar būt tukši.",
|
"metadata-required": "Metadatu ievadi nevar būt tukši.",
|
||||||
"output": "Izeja",
|
"output": "Izeja",
|
||||||
"test": "Tests",
|
"test": "Tests",
|
||||||
"help": "Palīdzība",
|
"help": "Palīdzība"
|
||||||
"reset-debug-mode": "Atiestatīt atkļūdošanu visās nodēs"
|
|
||||||
},
|
},
|
||||||
"tenant": {
|
"tenant": {
|
||||||
"tenant": "Īrnieks",
|
"tenant": "Īrnieks",
|
||||||
|
|||||||
@ -4560,8 +4560,7 @@
|
|||||||
"metadata-required": "Metagegevensvermeldingen mogen niet leeg zijn.",
|
"metadata-required": "Metagegevensvermeldingen mogen niet leeg zijn.",
|
||||||
"output": "Uitvoer",
|
"output": "Uitvoer",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Help",
|
"help": "Help"
|
||||||
"reset-debug-mode": "Foutopsporingsmodus resetten in alle rule nodes"
|
|
||||||
},
|
},
|
||||||
"role": {
|
"role": {
|
||||||
"role": "Rol",
|
"role": "Rol",
|
||||||
|
|||||||
@ -4520,7 +4520,6 @@
|
|||||||
"output": "Wyjście",
|
"output": "Wyjście",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Pomoc",
|
"help": "Pomoc",
|
||||||
"reset-debug-mode": "Zresetuj tryb debugowania we wszystkich węzłach",
|
|
||||||
"test-with-this-message": "{{test}} with this message",
|
"test-with-this-message": "{{test}} with this message",
|
||||||
"description": "Opis"
|
"description": "Opis"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1554,8 +1554,7 @@
|
|||||||
"metadata-required": "As entradas de metadados não podem estar em branco.",
|
"metadata-required": "As entradas de metadados não podem estar em branco.",
|
||||||
"output": "Saída",
|
"output": "Saída",
|
||||||
"test": "Teste",
|
"test": "Teste",
|
||||||
"help": "Ajuda",
|
"help": "Ajuda"
|
||||||
"reset-debug-mode": "Redefinir modo de depuração em todos os nós"
|
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
"timezone": "Fuso horário",
|
"timezone": "Fuso horário",
|
||||||
|
|||||||
@ -1401,7 +1401,6 @@
|
|||||||
"output": "Ieşire",
|
"output": "Ieşire",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Ajutor",
|
"help": "Ajutor",
|
||||||
"reset-debug-mode": "Dezactivează modul depanare în toate nodurile"
|
|
||||||
},
|
},
|
||||||
"tenant": {
|
"tenant": {
|
||||||
"tenant": "Locatar",
|
"tenant": "Locatar",
|
||||||
|
|||||||
@ -1879,8 +1879,7 @@
|
|||||||
"metadata-required": "Vnosi metapodatkov ne smejo biti prazni.",
|
"metadata-required": "Vnosi metapodatkov ne smejo biti prazni.",
|
||||||
"output": "Izdelek",
|
"output": "Izdelek",
|
||||||
"test": "Test",
|
"test": "Test",
|
||||||
"help": "Pomoč",
|
"help": "Pomoč"
|
||||||
"reset-debug-mode": "Ponastavi način za odpravljanje napak v vseh vozliščih"
|
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
"timezone": "Časovni pas",
|
"timezone": "Časovni pas",
|
||||||
|
|||||||
@ -2447,8 +2447,7 @@
|
|||||||
"metadata-required": "Meta veri girişleri boş bırakılamaz.",
|
"metadata-required": "Meta veri girişleri boş bırakılamaz.",
|
||||||
"output": "Çıktı",
|
"output": "Çıktı",
|
||||||
"test": "Ölçek",
|
"test": "Ölçek",
|
||||||
"help": "Yardım et",
|
"help": "Yardım et"
|
||||||
"reset-debug-mode": "Tüm düğümlerde hata ayıklama modunu sıfırla"
|
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
"timezone": "Saat dilimi",
|
"timezone": "Saat dilimi",
|
||||||
|
|||||||
@ -1979,7 +1979,7 @@
|
|||||||
"output": "Вихід",
|
"output": "Вихід",
|
||||||
"test": "Тест",
|
"test": "Тест",
|
||||||
"help": "Допомога",
|
"help": "Допомога",
|
||||||
"reset-debug-mode": "Вимкнути режим налагодження у всіх правилах"
|
"reset-debug-settings": "Вимкнути налаштування налагодження у всіх правилах"
|
||||||
},
|
},
|
||||||
"scheduler": {
|
"scheduler": {
|
||||||
"scheduler": "Планувальник",
|
"scheduler": "Планувальник",
|
||||||
|
|||||||
@ -4012,7 +4012,6 @@
|
|||||||
"output": "输出",
|
"output": "输出",
|
||||||
"test": "测试",
|
"test": "测试",
|
||||||
"help": "帮助",
|
"help": "帮助",
|
||||||
"reset-debug-mode": "重置所有节点中的调试模式",
|
|
||||||
"test-with-this-message": "使用此消息进行{{test}}测试",
|
"test-with-this-message": "使用此消息进行{{test}}测试",
|
||||||
"queue-hint": "选择一个队列将消息转发到另一个队列,默认情况下使用'Main'队列。",
|
"queue-hint": "选择一个队列将消息转发到另一个队列,默认情况下使用'Main'队列。",
|
||||||
"queue-singleton-hint": "选择一个队列以在多实体中转发消息,默认情况下使用'Main'队列。"
|
"queue-singleton-hint": "选择一个队列以在多实体中转发消息,默认情况下使用'Main'队列。"
|
||||||
|
|||||||
@ -2768,8 +2768,7 @@
|
|||||||
"metadata-required": "元資料項不能為空。",
|
"metadata-required": "元資料項不能為空。",
|
||||||
"output": "輸出",
|
"output": "輸出",
|
||||||
"test": "測試",
|
"test": "測試",
|
||||||
"help": "幫助",
|
"help": "幫助"
|
||||||
"reset-debug-mode": "重置所有節點中的調試模式"
|
|
||||||
},
|
},
|
||||||
"timezone": {
|
"timezone": {
|
||||||
"timezone": "時區",
|
"timezone": "時區",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user