feat(ValidationContextWrapper): add virtualized wrapper#3578
feat(ValidationContextWrapper): add virtualized wrapper#3578
Conversation
|
Я расширил пример в документации, добавив реальных инпутов, разные виды валидации и форму без виртуализации для сравнения. Он доступен по ссылке. На созвоне мы пришли к важному заключению, что все виды и сценарии валидации должны работать в виртуальном списке точно так же, как и без него. В текущем поведении есть отличия в виртуальном списке:
Такого не должно быть и это стоит устранить в любом случае. Далее опишу предложения для идеального решения. Они могут отпасть в ходе решения проблем выше, или наоборот, стать более актуальными. Поэтому, их можно рассмотреть во вторую очередь.
|
|
Заметил еще проблему, которую точно нужно решить, это фокус на поле с ошибкой по сабмиту. Сейчас в листе он не происходит. Думаю, нужно каким-то образом научиться находить нужный ValidationWrapper и вызывать метод focus у него, т.к. в нем есть нужная дополнительная логика. Проблему с динамическим переключением типа валидации и перемонтированием элементов внутри листа, которую еще обсуждали, предлагаю пока тоже отложить. |
Проблема
Валидации работают только с элементами, смонтированными в dom-дерево. Если есть данные, что невалидны по правилам валидации, но их не существует - форма будет считаться валидной. Проблемы появляются с отрисовкой больших списков. Если использовать виртуализацию, то неотрисованные данные не отвалидируются и данные, потенциально, сохранятся с ошибкой.
Решение
ValidationBuilder при создании сразу валидирует данные по правилам, переданным в него. У ValidationContainer\ValidationWrapper нет доступа явного к билдеру. Идея состоит в том, что мы передаем явно массив node, используемых для отрисовки строк\таблиц и читаем вглубь через ValidationReader до первого состояния error\warning и возвращаем индекс строки. Специальный кмопонент ValidationWrapperVirtualizedInternal при валидации передает этот индекс и сохраняет знание о том, что внутри него какой-то элемент невалиден.
Чек-лист перед запросом ревью
Добавлены тесты на все изменения
⬜ unit-тесты для логики
⬜ скриншоты для верстки и кросс-браузерности
✅ нерелевантно
Добавлена (обновлена) документация
✅ styleguidist для пропов и примеров использования компонентов
⬜ jsdoc для утилит и хелперов
⬜ комментарии для неочевидных мест в коде
⬜ прочие инструкции (
README.md,contributing.mdи др.)⬜ нерелевантно
Изменения корректно типизированы
⬜ без использования
any(см. PR2856)✅ нерелевантно
Прочее
⬜ все тесты и линтеры на CI проходят
✅ в коде нет лишних изменений
⬜ заголовок PR кратко и доступно отражает суть изменений (он попадет в changelog)