Refactor dashboard state duplicate fix.

This commit is contained in:
deaflynx 2025-08-01 16:20:01 +03:00
parent fd70520801
commit 260772ce55

View File

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