diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts index ac4b895d37..244bafcf29 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/states/manage-dashboard-states-dialog.component.ts @@ -258,61 +258,54 @@ export class ManageDashboardStatesDialogComponent } duplicateState($event: Event, state: DashboardStateInfo) { - const originalState = state; - const newStateName = this.getNextDuplicatedName(state.name); - if (newStateName) { - const newStateId = newStateName.toLowerCase().replace(/\W/g, '_'); - if (this.states[newStateId]) { - this.stateNames.add(newStateName); - this.duplicateState(null, state); - return; + const suffix = ` - ${this.translate.instant('action.copy')} `; + let counter = 0; + const maxAttempts = 1000; + + while (counter++ < maxAttempts) { + const candidateName = `${state.name}${suffix}${counter}`; + if (this.stateNames.has(candidateName)) continue; + + const candidateId = candidateName.toLowerCase().replace(/\W/g, '_'); + if (this.states[candidateId]) { + continue; } - const duplicatedStates = deepClone(originalState); + + const originalState = state; + const duplicatedState = deepClone(originalState); const duplicatedWidgets = deepClone(this.widgets); const mainWidgets = {}; const rightWidgets = {}; - duplicatedStates.id = newStateId; - duplicatedStates.name = newStateName; - duplicatedStates.root = false; - this.stateNames.add(duplicatedStates.name); + duplicatedState.id = candidateId; + duplicatedState.name = candidateName; + duplicatedState.root = false; + this.stateNames.add(duplicatedState.name); - for (const [key, value] of Object.entries(duplicatedStates.layouts.main.widgets)) { + for (const [key, value] of Object.entries(duplicatedState.layouts.main.widgets)) { const guid = this.utils.guid(); mainWidgets[guid] = value; duplicatedWidgets[guid] = this.widgets[key]; duplicatedWidgets[guid].id = guid; } - duplicatedStates.layouts.main.widgets = mainWidgets; + duplicatedState.layouts.main.widgets = mainWidgets; - if (isDefined(duplicatedStates.layouts?.right)) { - for (const [key, value] of Object.entries(duplicatedStates.layouts.right.widgets)) { + if (isDefined(duplicatedState.layouts?.right)) { + for (const [key, value] of Object.entries(duplicatedState.layouts.right.widgets)) { const guid = this.utils.guid(); rightWidgets[guid] = value; duplicatedWidgets[guid] = this.widgets[key]; duplicatedWidgets[guid].id = guid; } - duplicatedStates.layouts.right.widgets = rightWidgets; + duplicatedState.layouts.right.widgets = rightWidgets; } - this.states[duplicatedStates.id] = duplicatedStates; + this.states[duplicatedState.id] = duplicatedState; this.widgets = duplicatedWidgets; this.onStatesUpdated(); + return; } } - private getNextDuplicatedName(stateName: string): string { - const suffix = ` - ${this.translate.instant('action.copy')} `; - let counter = 0; - while (++counter < Number.MAX_SAFE_INTEGER) { - const newName = `${stateName}${suffix}${counter}`; - if (!this.stateNames.has(newName)) { - return newName; - } - } - - return null; - } - private onStatesUpdated() { this.statesFormGroup.markAsDirty(); this.updateData(true);