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

[BUG] @prizm-ui/components - PrizmInputComponent with NgxMaskDirective behaves incorrectly when changed from empty value #1190

Open
1 of 9 tasks
AleksandrSibiakov opened this issue Dec 14, 2023 · 3 comments
Assignees
Labels
answer:research_need estimate:sp3 Story Point - 3 priority:middle Tag: priority:middle — Denotes tasks or issues with a moderate level of importance. These items shou source:idp issue from IDP state:ready ready for release (pass tested) type:bug Something isn't working version:3 version:4
Milestone

Comments

@AleksandrSibiakov
Copy link
Contributor

AleksandrSibiakov commented Dec 14, 2023

Библиотека

Выберите нужное отметив галочку [x]

  • @prizm-ui/core
  • @prizm-ui/components
  • @prizm-ui/install
  • @prizm-ui/icons
  • @prizm-ui/flag-icons
  • @prizm-ui/theme
  • @prizm-ui/charts
  • @prizm-ui/ast
  • @prizm-ui/nx-plugin

Компонент

PrizmInputComponent

Версия

➜ npm ls @prizm-ui/components

@prizm-ui/components 3.7.0

Воспроизведение проблемы

https://stackblitz.com/edit/prizm-v3-input-with-mask?file=src%2Fapp%2Fapp.component.html

Описание проблемы

Сценарий - ограничение символов в поле ввода (числовое, или произвольное)

Есть проблема следующего характера:

При изменении значения <input prizmInput mask="..."> с пустого на произвольное (т.е. первое изменение), это изменение

  • не помечает поле как dirty
  • при вводе недопустимого символа, этот символ попадает в модель (см. Case 2 со stackblitz выше)

Результаты исследования

Дебаг выявил, что проблема появляется после попадания в следующий вызов
image

Как видим, this.value получает значение 2 - значение из поля ввода, в то время как значение контрола еще не обновилось, это ведет к вызову ngControl.control.setValue на строчке

if (value !== this.ngControl?.value) this.ngControl?.control?.setValue(value);

тем самым обновляя значение formControl в обход стандартного потока значений - вызова колбэка зарегестрированного через registerOnChange.

Предлагаю:

  • не использовать FormControl.setValue при апдейте значения в инпуте (и вообще) - это не верно, и такой функционал выходит за рамки данной директивы\компонента (предполагаю, что вызов updateHint является целью вызова updateValue - можно updateHint вызвать напрямую)
@ZurabDev ZurabDev added answer:research_need priority:middle Tag: priority:middle — Denotes tasks or issues with a moderate level of importance. These items shou labels Dec 14, 2023
@ZurabDev ZurabDev self-assigned this Dec 14, 2023
@ZurabDev ZurabDev added the estimate:sp3 Story Point - 3 label Dec 14, 2023
@alexhawkins94 alexhawkins94 added the type:bug Something isn't working label Dec 14, 2023
@AleksandrSibiakov
Copy link
Contributor Author

AleksandrSibiakov commented Dec 15, 2023

Еще подумал (в тему корректности использования ngControl.setValue в компоненте) - а вы проверяете поведение на сетапах типа ngModelOptions="{ updateOn: 'blur' }" ?

Ведь в этом случае, к примеру при вызове InputTextComponent.clear (в котором тоже вызывается updateValue -> control.setValue), setValue апдейтит значение сразу, тогда как при нормальном потоке, через событие инпута на HTMLInputElement, или вызове зарегестрированного registerOnChange значение запишется только в ngControl._pendingValue и отправится в модель только по событию blur (а если точнее, после вызова зарегестрированного через CVA.registerOnTouched колбэка)

@AleksandrSibiakov AleksandrSibiakov changed the title [BUG] @prizm-ui/components - PrizmInputComponent with NgxMaskDirective not marked as dirty when changed from empty value [BUG] @prizm-ui/components - PrizmInputComponent with NgxMaskDirective behaves incorrectly when changed from empty value Dec 15, 2023
@ickisIckis ickisIckis added this to the 4.4.0 milestone Feb 6, 2024
@bumalai bumalai added the source:idp issue from IDP label Feb 20, 2024
@AleksandrSibiakov
Copy link
Contributor Author

Та же цепочка событий приводит к тому что валидаторы запускаются после первого символа, даже если явно указать updateOn: blur (нам нужно для ограничения кол-ва вызовов асинхронного валидатора).
Если надо, могу как отдельную проблему оформить, но суть та же - это из за вызова FormControl.setValue

@ZurabDev
Copy link
Contributor

Та же цепочка событий приводит к тому что валидаторы запускаются после первого символа, даже если явно указать updateOn: blur (нам нужно для ограничения кол-ва вызовов асинхронного валидатора). Если надо, могу как отдельную проблему оформить, но суть та же - это из за вызова FormControl.setValue

Можешь оформить пожалуйста отдельно?

@ZurabDev ZurabDev modified the milestones: 4.4.2, 4.3.6 Jul 17, 2024
ZurabDev added a commit that referenced this issue Jul 17, 2024
fix(components/input): refactor select, multi-select and fixed with update value #1190
ZurabDev added a commit that referenced this issue Jul 19, 2024
…tComponent when NgxMaskDirective is applied and the value changes from an empty state. #1190
ickisIckis added a commit that referenced this issue Jul 22, 2024
fix(components/input-text): incorrect behavior occurring in PrizmInputComponent when NgxMaskDirective is applied and the value changes from an empty state. #1190
@ickisIckis ickisIckis mentioned this issue Jul 22, 2024
66 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
answer:research_need estimate:sp3 Story Point - 3 priority:middle Tag: priority:middle — Denotes tasks or issues with a moderate level of importance. These items shou source:idp issue from IDP state:ready ready for release (pass tested) type:bug Something isn't working version:3 version:4
Projects
None yet
Development

No branches or pull requests

5 participants