Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Input] Setting .value before render() throws an error #10405

Closed
2 of 6 tasks
maxpatiiuk opened this issue Sep 26, 2024 · 4 comments
Closed
2 of 6 tasks

[Input] Setting .value before render() throws an error #10405

maxpatiiuk opened this issue Sep 26, 2024 · 4 comments
Assignees
Labels
4 - verified Issues that have been released and confirmed resolved. bug Bug reports for broken functionality. Issues should include a reproduction of the bug. calcite-components Issues specific to the @esri/calcite-components package. estimate - 3 A day or two of work, likely requires updates to tests. impact - p3 - not time sensitive User set priority impact status of p3 - not time sensitive p - medium Issue is non core or affecting less that 60% of people using the library

Comments

@maxpatiiuk
Copy link
Member

Check existing issues

Actual Behavior

calcite-input has a watcher on value property. When watcher triggers, it updates the HTML element:

private setInputValue = (newInputValue: string): void => {
if (this.type === "text" && !this.childEl) {
return;
}
if (this.type === "number" && !this.childNumberEl) {
return;
}
this[`child${this.type === "number" ? "Number" : ""}El`].value = newInputValue;
};

If .value property is set after component's constructor() (because Stencil watchers are disabled before that), but before render() (because .childEl ref is set after render()), the above watcher will fail with this exception:

TypeError: Cannot set properties of undefined (setting 'value')

The issue is that while the watcher checks for this.childEl being undefined, it only does so when input type is text.
This might be an artifact back from when this input only support number and input types?

Expected Behavior

Setting value should not produce an exception

Reproduction Sample

https://codepen.io/maxpatiiuk/pen/ZEgGWod?editors=1010

Reproduction Steps

  1. Set .value property or a calcite-input with a type not equal to text and not equal to number after component's constructor() triggered but before render()
  2. See exception in the console

Reproduction Version

2.13.0

Relevant Info

No response

Regression?

No response

Priority impact

impact - p3 - not time sensitive

Impact

No response

Calcite package

  • @esri/calcite-components
  • @esri/calcite-components-angular
  • @esri/calcite-components-react
  • @esri/calcite-design-tokens
  • @esri/eslint-plugin-calcite-components

Esri team

N/A

@maxpatiiuk maxpatiiuk added bug Bug reports for broken functionality. Issues should include a reproduction of the bug. 0 - new New issues that need assignment. needs triage Planning workflow - pending design/dev review. labels Sep 26, 2024
@github-actions github-actions bot added calcite-components Issues specific to the @esri/calcite-components package. impact - p3 - not time sensitive User set priority impact status of p3 - not time sensitive labels Sep 26, 2024
@maxpatiiuk
Copy link
Member Author

Side node:

this line in the watcher has several issues:

this[child${this.type === "number" ? "Number" : ""}El].value = newInputValue;

  • Dynamic property access has worse performance - since there are only two possible properties, it's better to explicitly write out the two branches in an if/else
  • This is less readable
  • TypeScript is not as good at reporting type errors for such dynamic property accesses (especially on HTMLElement prototype)
  • IDE go-to-definition and go-to-usages features don't work
  • IDE "refactor -> rename" feature doesn't work
  • Minification of private properties would break such dynamic reference.

@jcfranco jcfranco self-assigned this Sep 30, 2024
@jcfranco jcfranco added 1 - assigned Issues that are assigned to a sprint and a team member. estimate - 3 A day or two of work, likely requires updates to tests. p - medium Issue is non core or affecting less that 60% of people using the library and removed 0 - new New issues that need assignment. needs triage Planning workflow - pending design/dev review. labels Sep 30, 2024
@jcfranco jcfranco added this to the 2024-10-29 - Oct Milestone milestone Sep 30, 2024
@maxpatiiuk
Copy link
Member Author

Changing the setInputValue like this seems to fix the issue:

  private setInputValue(newInputValue: string): void {
    if (this.type === "number" && this.childNumberEl) {
      this.childNumberEl.value = newInputValue;
    } else if (this.childEl) {
      this.childEl.value = newInputValue;
    }
  }

jcfranco added a commit that referenced this issue Nov 15, 2024
**Related Issue:** #10310, #10481, #10399, #10405, #10491, #10434,
#10495, #9260

## Noteworthy changes

* components are now Lit-based
* removed `@storybook/test` and `@storybook/addon-interactions` as these
were not being actively used
* React deps bumped to v18
* Added default `scale` value to:
  * `action-bar`
  * `action-group`
  * `action-menu`
  * `action-pad`
* Path of extras will change to the following:
* `/dist/extras/vscode-data.json` ➡️
`/dist/docs/vscode.html-custom-data.json`
* backwards-compatible version is preserved to not break Intellisense
[described in the
doc](https://developers.arcgis.com/calcite-design-system/resources/frameworks/#visual-studio-intellisense)
	* `/dist/extras/docs-json.json` ➡️ `/dist/docs/docs.json` (internal)
* `/dist/extras/translations-json.json` ➡️
`/dist/docs/translations.json` (internal)
	* `/dist/extras/docs-json.d.ts` ❌ (removed, internal)

BREAKING CHANGE: 

* for a consistent development experience, components now convert `null`
to `undefined`, so developers will need to update code with strict null
checks
* removed the following `@esri/eslint-plugin-calcite-components` rules
as they are no longer valid:
	* `ban-props-on-host`
	* `enforce-ref-last-prop`
	* `require-event-emitter-type`

---------

Co-authored-by: JC Franco <jfranco@esri.com>
Co-authored-by: Ben Elan <no-reply@benelan.dev>
Co-authored-by: Calcite Admin <calcite-admin@esri.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@jcfranco jcfranco added the 3 - installed Issues that have been merged to master branch and are ready for final confirmation. label Nov 15, 2024
Copy link
Contributor

Installed and assigned for verification.

@jcfranco jcfranco removed the 1 - assigned Issues that are assigned to a sprint and a team member. label Nov 15, 2024
@DitwanP
Copy link
Contributor

DitwanP commented Nov 15, 2024

🍡 Verified on 3.0.0-next.11

@DitwanP DitwanP closed this as completed Nov 15, 2024
@geospatialem geospatialem added 4 - verified Issues that have been released and confirmed resolved. and removed 3 - installed Issues that have been merged to master branch and are ready for final confirmation. labels Nov 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
4 - verified Issues that have been released and confirmed resolved. bug Bug reports for broken functionality. Issues should include a reproduction of the bug. calcite-components Issues specific to the @esri/calcite-components package. estimate - 3 A day or two of work, likely requires updates to tests. impact - p3 - not time sensitive User set priority impact status of p3 - not time sensitive p - medium Issue is non core or affecting less that 60% of people using the library
Projects
None yet
Development

No branches or pull requests

4 participants