fix(properties): enhance element detection in properties panel with recursive search and retry mechanism
This commit is contained in:
@ -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;
|
||||
|
Reference in New Issue
Block a user