fix(properties): enhance element detection in properties panel with recursive search and retry mechanism

This commit is contained in:
Juergen Kunz
2025-06-16 13:10:12 +00:00
parent fca47b87fb
commit 6bdb8c78b7
7 changed files with 107 additions and 11 deletions

View File

@ -226,6 +226,31 @@ export class WccProperties extends DeesElement {
`;
}
private async findElementRecursively(container: Element, elementClass: any, maxDepth: number = 5): Promise<HTMLElement | null> {
if (maxDepth <= 0) return null;
// Check direct children
for (const child of Array.from(container.children)) {
if (child instanceof elementClass) {
return child as HTMLElement;
}
}
// Check shadow roots of children
for (const child of Array.from(container.children)) {
if (child.shadowRoot) {
const found = await this.findElementRecursively(child.shadowRoot as any, elementClass, maxDepth - 1);
if (found) return found;
}
// Also check nested children
const found = await this.findElementRecursively(child, elementClass, maxDepth - 1);
if (found) return found;
}
return null;
}
public async createProperties() {
console.log('creating properties for:');
console.log(this.selectedItem);
@ -275,15 +300,30 @@ export class WccProperties extends DeesElement {
}
console.log(anonItem.elementProperties);
const wccFrame = await this.dashboardRef.wccFrame;
let firstFoundInstantiatedElement: HTMLElement;
for (const element of Array.from((await wccFrame.getViewportElement()).children)) {
if (element instanceof (this.selectedItem as any)) {
firstFoundInstantiatedElement = element as HTMLElement;
break;
}
// Wait for render to complete
await new Promise(resolve => setTimeout(resolve, 100));
// Try to find the element with recursive search
const viewport = await wccFrame.getViewportElement();
let firstFoundInstantiatedElement: HTMLElement = await this.findElementRecursively(
viewport,
this.selectedItem as any
);
// Retry logic if element not found
let retries = 0;
while (!firstFoundInstantiatedElement && retries < 5) {
await new Promise(resolve => setTimeout(resolve, 200));
firstFoundInstantiatedElement = await this.findElementRecursively(
viewport,
this.selectedItem as any
);
retries++;
}
if (!firstFoundInstantiatedElement) {
this.warning = `no first instantiated element found for >>${anonItem.name}<<`;
this.warning = `no first instantiated element found for >>${anonItem.name}<< after ${retries} retries`;
return;
}
const classProperties: Map<string, any> = anonItem.elementProperties;