UI: Debug Settings fixes

This commit is contained in:
mpetrov 2024-12-06 17:07:15 +02:00
parent ab2e788057
commit 09bc214bd3
28 changed files with 79 additions and 77 deletions

View File

@ -305,7 +305,7 @@ export class ItemBufferService {
connectors: [], connectors: [],
additionalInfo: origNode.additionalInfo, additionalInfo: origNode.additionalInfo,
configuration: origNode.configuration, configuration: origNode.configuration,
debugMode: origNode.debugMode, debugSettings: origNode.debugSettings,
x: origNode.x, x: origNode.x,
y: origNode.y, y: origNode.y,
name: origNode.name, name: origNode.name,

View File

@ -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).trim() }}
<span *ngIf="(isDebugAllActive$ | async) && !failuresEnabled"> } @else {
{{ !allEnabled ? (allEnabledUntil | durationLeft) : ('debug-config.min' | translate: { number: maxDebugModeDurationMinutes }) }} {{ failuresEnabled ? ('debug-config.failures' | translate) : ('common.disabled' | translate) }}
</span> }
<span *ngIf="!(isDebugAllActive$ | async) && failuresEnabled" translate>debug-config.failures</span>
</button> </button>

View File

@ -14,18 +14,26 @@
/// limitations under the License. /// limitations under the License.
/// ///
import { ChangeDetectionStrategy, Component, forwardRef, Input, Renderer2, ViewContainerRef } from '@angular/core'; import {
ChangeDetectionStrategy,
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 +68,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 +85,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 = () => {};
@ -91,17 +99,17 @@ export class DebugSettingsButtonComponent implements ControlValueAccessor {
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 +128,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
}, },
{}, {},
@ -141,6 +149,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});
} }

View File

@ -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).trim() } }}
} @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).trim() } }}
</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>

View File

@ -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();
} }

View File

@ -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>

View File

@ -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(({ debugSettings }) => debugSettings && this.isDebugSettingsActive(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({ allEnabled = false, failuresEnabled = false, allEnabledUntil = 0 }: DebugSettings): boolean {
return allEnabled || failuresEnabled || allEnabledUntil > new Date().getTime();
}
validate() { validate() {
setTimeout(() => { setTimeout(() => {
this.isInvalid = false; this.isInvalid = false;

View File

@ -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' },

View File

@ -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": {

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -1886,8 +1886,7 @@
"metadata-required": "Οι καταχωρίσεις μεταδεδομένων δεν μπορούν να είναι κενές.", "metadata-required": "Οι καταχωρίσεις μεταδεδομένων δεν μπορούν να είναι κενές.",
"output": "Απόδοση", "output": "Απόδοση",
"test": "Τεστ", "test": "Τεστ",
"help": "Βοήθεια", "help": "Βοήθεια"
"reset-debug-mode": "Επαναφορά λειτουργίας εντοπισμού σφαλμάτων σε όλους τους κόμβους"
}, },
"role": { "role": {
"role": "Ρόλος", "role": "Ρόλος",

View File

@ -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."
} }
@ -4293,7 +4291,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."
@ -4743,6 +4741,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 ",

View File

@ -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": {

View File

@ -1413,8 +1413,7 @@
"metadata-required": "მეტამონაცემები ვერ იქნება ცარიელი", "metadata-required": "მეტამონაცემები ვერ იქნება ცარიელი",
"output": "რეზულტატი", "output": "რეზულტატი",
"test": "ტესტი", "test": "ტესტი",
"help": "დახმარება", "help": "დახმარება"
"reset-debug-mode": "Debug რეჟიმის გათიშვა ყველა ნოდისთვის"
}, },
"tenant": { "tenant": {
"tenant": "ტენანტი", "tenant": "ტენანტი",

View File

@ -1878,8 +1878,7 @@
"metadata-required": "메타데이터 엔트리를 입력하세요.", "metadata-required": "메타데이터 엔트리를 입력하세요.",
"output": "출력", "output": "출력",
"test": "테스트", "test": "테스트",
"help": "도움말", "help": "도움말"
"reset-debug-mode": "모든 노드에 대해 디버그 모드 초기화"
}, },
"timezone": { "timezone": {
"timezone": "Timezone", "timezone": "Timezone",

View File

@ -4504,7 +4504,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"
}, },
"role": { "role": {

View File

@ -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",

View File

@ -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",

View File

@ -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"
}, },

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -1978,8 +1978,7 @@
"metadata-required": "Записи метаданих не можуть бути порожніми.", "metadata-required": "Записи метаданих не можуть бути порожніми.",
"output": "Вихід", "output": "Вихід",
"test": "Тест", "test": "Тест",
"help": "Допомога", "help": "Допомога"
"reset-debug-mode": "Вимкнути режим налагодження у всіх правилах"
}, },
"scheduler": { "scheduler": {
"scheduler": "Планувальник", "scheduler": "Планувальник",

View File

@ -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'队列。"

View File

@ -2768,8 +2768,7 @@
"metadata-required": "元資料項不能為空。", "metadata-required": "元資料項不能為空。",
"output": "輸出", "output": "輸出",
"test": "測試", "test": "測試",
"help": "幫助", "help": "幫助"
"reset-debug-mode": "重置所有節點中的調試模式"
}, },
"timezone": { "timezone": {
"timezone": "時區", "timezone": "時區",