fix(properties-panel): improve element detection timing and value handling in properties panel

This commit is contained in:
Juergen Kunz
2025-06-16 17:56:14 +00:00
parent 3d1948b93e
commit c64b106569
3 changed files with 25 additions and 11 deletions

View File

@ -25,9 +25,11 @@ The properties panel had timing issues detecting rendered elements because:
### Code Flow ### Code Flow
1. Dashboard renders element demo into viewport using `render(anonItem.demo(), viewport)` 1. Dashboard renders element demo into viewport using `render(anonItem.demo(), viewport)`
2. Properties panel waits, then searches recursively for the element instance 2. Properties panel waits 200ms for demo wrappers to run and set initial values
3. If not found, retries with delays to handle async rendering 3. Searches recursively for the element instance
4. Once found, extracts and displays element properties 4. If not found, retries with delays to handle async rendering
5. Once found, extracts and displays element properties
6. Uses property binding (`.value=`) instead of attribute binding to prevent input events during initialization
## Demo Tools ## Demo Tools

View File

@ -85,4 +85,16 @@ These test various scenarios:
- Complex data type display and editing - Complex data type display and editing
- Element detection inside dees-demowrapper - Element detection inside dees-demowrapper
- Error handling for problematic values - Error handling for problematic values
- Deep nesting and shadow DOM traversal - Deep nesting and shadow DOM traversal
# Fixed Demo Value Overwriting (COMPLETED)
## Issue:
Properties panel was overwriting values set by demo functions
## Solution:
1. Changed from attribute binding (`value=`) to property binding (`.value=`)
2. This prevents browser from firing input events during initialization
3. Added proper number parsing for number inputs
4. Increased initial wait to 200ms for demo wrappers to complete
5. Simplified select element handling to use property binding

View File

@ -309,8 +309,8 @@ export class WccProperties extends DeesElement {
console.log(anonItem.elementProperties); console.log(anonItem.elementProperties);
const wccFrame = await this.dashboardRef.wccFrame; const wccFrame = await this.dashboardRef.wccFrame;
// Wait for render to complete // Wait for render to complete and any demo wrappers to run
await new Promise(resolve => setTimeout(resolve, 100)); await new Promise(resolve => setTimeout(resolve, 200));
// Try to find the element with recursive search // Try to find the element with recursive search
const viewport = await wccFrame.getViewportElement(); const viewport = await wccFrame.getViewportElement();
@ -370,7 +370,7 @@ export class WccProperties extends DeesElement {
case 'String': case 'String':
return html`<input return html`<input
type="text" type="text"
value=${firstFoundInstantiatedElement[key]} .value=${firstFoundInstantiatedElement[key] || ''}
@input="${(eventArg: any) => { @input="${(eventArg: any) => {
firstFoundInstantiatedElement[key] = eventArg.target.value; firstFoundInstantiatedElement[key] = eventArg.target.value;
}}" }}"
@ -378,14 +378,15 @@ export class WccProperties extends DeesElement {
case 'Number': case 'Number':
return html`<input return html`<input
type="number" type="number"
value=${firstFoundInstantiatedElement[key]} .value=${firstFoundInstantiatedElement[key] ?? ''}
@input="${(eventArg: any) => { @input="${(eventArg: any) => {
firstFoundInstantiatedElement[key] = eventArg.target.value; firstFoundInstantiatedElement[key] = parseFloat(eventArg.target.value) || 0;
}}" }}"
/>`; />`;
case 'Enum': case 'Enum':
const enumValues: any[] = getEnumValues(property); const enumValues: any[] = getEnumValues(property);
return html`<select return html`<select
.value=${firstFoundInstantiatedElement[key] || ''}
@change="${(eventArg: any) => { @change="${(eventArg: any) => {
firstFoundInstantiatedElement[key] = eventArg.target.value; firstFoundInstantiatedElement[key] = eventArg.target.value;
}}" }}"
@ -393,8 +394,7 @@ export class WccProperties extends DeesElement {
${enumValues.map((valueArg) => { ${enumValues.map((valueArg) => {
return html` return html`
<option <option
?selected=${valueArg === firstFoundInstantiatedElement[key] ? true : false} value="${valueArg}"
name="${valueArg}"
> >
${valueArg} ${valueArg}
</option> </option>