Перейти к основному содержимому

Флоу

Глоссарий

Продакшен и превью моды

В продакшен моде шаги заявки следуют строгим законам. Переходы между шагами тригерят сохранение черновика в том или ином виде.

В превью моде можно свободно ходить между шагами, и черновик естественно не сохраняется.

Зайти в превью мод можно по кнопке Предпросмотр в CMS или прописав гет-параметр preview=1 в конце боевого URL

Пример:

// боевой URL
https://tavrida.art/fest/application

// принудительный превью-мод
https://tavrida.art/fest/application?preview=1

Пример, если в URL уже есть гет-параметр. Добавляем параметр через знак &

// боевой URL
https://tavrida.art/grants/accelerator/application?part=6f251f59-4726-4abb-bc74-b6bfca1150bd

// принудительный превью-мод
https://tavrida.art/grants/accelerator/application?part=6f251f59-4726-4abb-bc74-b6bfca1150bd&preview=1


Подсвечивание шагов

Серый - заблокированный шаг, на который нельзя перейти

Нужно заполнить предыдущие.

Черный - незаполненный шаг, на который можно перейти

В продакшене это шаг, следующий за последним зеленым.

Зеленый - валидный шаг в цепочке с самого начала без разрыва.

На него можно перейти всегда.

Разрыв в цепочке?

Представим, есть 5 шагов. [OK] - значит все блоки внутри шага правильно заполнены. [BAD] - значит хотя бы один из блоков внутри шага невалиден.

[OK] Выбор направления
[BAD] Опыт
[OK] Персональная информация
[BAD] Регион подачи заявки
[BAD] Задание
Проверка

Зеленым подсветится только Выбор направления, следующий после него Опыт будет черным. Все остальные шаги будут серыми, даже полностью валидный шаг Персональная информация, потому что мы не даем перейти дальше, пока не будут заполнены все шаги по порядку.




Прежде чем перейти к прыжкам между шагами и кнопкам:

Обновление заявки

Ниже описан общий процесс, на который опираются более специфичные сценарии.

Перед началом имеем:

  • Актуальное состояние юзера на беке userStoreValue
  • Актуальное состояние полей заявки на беке applicationManager.store
  • Пустой список того, как поменять актуальное состояние юзера на беке updaters
  • Пустой список ошибок errors
  • Пустой словарь изменившихся, но невалидных блоков ЛК userDeletedInfo
  • Если загружали файлы, у инпутов типа "Загрузка файла" красные подписи Чтобы завершить загрузку файла, сохрани черновик[ или нажми "Продолжить"]

Начинаем.

1. Проход по каждому блоку ЛК

Неважно, что мы сейчас на шаге 1, а блоки ЛК лежат в 3, 5 и 7

1.1. Заполнение блока ЛК изменилось?

Каждый блок ЛК имеет метод .isChanged(), который определяет, менял ли юзер контент блока.

Для разработки:

  • Использовать нестрогое сравнение isEqualOrBothEmpty(a, b) для блоков, где поля, например, меняют значение null на пустую строку
  • Проверять моменты, где в userStoreValue.stuff пустой массив, а в storeValue[0] пустой итем (все проперти null / undefined / '')

Если блок "не изменился", игнорим его. На следующий пункт не переходим.

1.2. Блок валиден?

Каждый блок ЛК имеет метод .validateWithUser(). Если блок целиком валиден - переходим на следующий пункт.

Если блок не валиден - запоминаем, но на следующий шаг не переходим. Вспомним про него чуть позже. Для разработки: возвращаем userDeletedInfo

return {
errors,
updaters,
userDeletedInfo: userDeletedInfoUtility.buildInfo(userDeletedInfoUtility.keys.passport)
}

1.3. Отправляем запрос на бек

Для каждого блока ЛК есть свой уникальный запрос на бек АИС.

Если он упал - добавляем ошибки в errors.

Если успешен - добавляем элемент в updaters.


2. Прошлись по всем блокам ЛК

Накопили:

  • Список того, как поменять актуальное состояние юзера на беке updaters
  • Список ошибок errors
  • Словарь изменившихся, но невалидных блоков ЛК userDeletedInfo

Актуальное состояние юзера на беке userStoreValue обновляется, если список updaters не пустой


3. Составляем тело запроса самой заявки

И сравниваем с актуальным состоянием заявки на беке applicationManager.store. Если ничего не поменялось (актуальное состояние на беке и тело запроса равны) - останавливаемся.

4. Если поля зявки поменялись - отправляем запрос в АИС на обновление заявки

Если запрос упал или просто ответил ошибкой - добавляем их в список ошибок errors

В конце имеем такой результат:

  • Список ошибок errors
  • Словарь изменившихся, но невалидных блоков ЛК userDeletedInfo
  • Тело запроса, который не пытались или пытались (успешно или неуспешно) отправить
  • Были ли обновлены поля заявки - Да/Нет



Кнопка "Сохранить черновик"

Задействует стандартный сценарий обновления заявки (пункт выше). После сценария смотрит на получившийся результат:

  • Список ошибок errors
  • Словарь изменившихся, но невалидных блоков ЛК userDeletedInfo
  • Тело запроса, который не пытались или пытались (успешно или неуспешно) отправить
  • Были ли обновлены поля заявки - Да/Нет

Если в списке ошибок errors есть хотя бы одна, выводит попап

Ошибка
При сохранении черновика произошла ошибка
[ОК]
  • Это негативный исход.
  • Актуальное состояние заявки на беке не меняется.
  • У инпутов типа "Загрузка файла" красные подписи Чтобы завершить загрузку файла... не пропадают

Если ошибок errors нет, и словарь изменившихся, но невалидных блоков ЛК userDeletedInfo пустой

Если не режим "Молча", выводится попап

Черновик сохранен
Ты можешь найти его и завершить с ним работу в
Личном кабинете
[Вернуться к заполнению]
  • Это успешный исход.
  • Актуальное состояние заявки на беке applicationManager.store обновляется
  • У инпутов типа "Загрузка файла" пропадают красные подписи Чтобы завершить загрузку файла...
подсказка

Попап успеха выводится даже если ни один запрос на бек (ни на обновление заявки, на на обновление одного из блоков ЛК) не был отправлен.

Если ошибок нет, и словарь изменившихся, но невалидных блоков ЛК - имеет хотя бы один элемент

Если не режим "Молча", выводится попап, где перечислены невалидные блоки

Черновик обновлен
При обновлении некоторых блоков возникли ошибки, перед отправкой заявки обязательно проверь:
- Личные данные
- Паспорт
- Образование
[Хорошо]
  • Это успешный исход.
  • Актуальное состояние заявки на беке applicationManager.store обновляется
  • У инпутов типа "Загрузка файла" пропадают красные подписи Чтобы завершить загрузку файла...
подсказка

Попап успеха выводится даже если ни один запрос на бек (ни на обновление заявки, на на обновление одного из блоков ЛК) не был отправлен




Кнопка "Продолжить" или нажатие на один из зеленых или черных шагов (кроме текущего)

В превью моде просто прыгаем на новый шаг. Дальше про продакшен.

Прыжок на любой шаг назад (относительно текущего)

  • Черновик даже не пытаемся сохранить
  • Выключается подсветка ошибок, если была включена

Прыжок на шаг вперед

Проверяем все блоки текущего шага на валидность. Если хотя бы один невалиден - включаем подсветку ошибок. На новый шаг перехода не происходит.

Если текущий шаг валиден - запускаем процесс сохранения черновика в режиме "Молча", см. пункт выше. По итогу выполнения имеем Успешный или Негативный исход. В случае успешного исхода попапы о сохранении черновика не показываются.

Негативный исход

Остаемя на текущем шаге

Успешный исход

Переходим на следующий шаг




Кнопка "Отправить заявку"

Если в заявке один шаг, видна сразу. Если шагов много - видна на экране проверки результатов.

В превью моде просто открывает экран успеха. Дальше про продакшен:

Проверка валидности всех блоков заявки

Если хотя бы один блок невалиден

Включаем подсветку ошибок и останавливаемся. Это нужно для заявок с одним шагом. В заявках с несколькими шагами до этой кнопки юзер просто не дойдет, если хотя бы один из блоков заявки невалиден.

Также подсветятся не чекнутые чекбоксы.

Если хотя бы один чекбокс (если есть) не чекнут

Включаем подсветку ошибок и останавливаемся. Должны подсветиться все не чекнутые чекбоксы.

Если юзер смотрит с мобильного устройства или планшета (это определяется шириной экрана меньше 1440px), должен произойти доскролл до чекбоксов.


Попытка отправить заявку

Задействуем сценарий обновления заявки, см. выше. По итогу выполнения имеем такой результат:

  • Список ошибок errors
  • Словарь изменившихся, но невалидных блоков ЛК userDeletedInfo
  • Тело запроса, который не пытались или пытались (успешно или неуспешно) отправить
  • Были ли обновлены поля заявки - Да/Нет

Нас интересует только список ошибок errors.

Если есть хотя бы одна ошибка errors

Останавливаемся. Выводим попап

Ошибка
При отправке заявки произошла ошибка:
- A
- B
- C
[Ок]
осторожно

Иногда ошибки приходят не в человекочитаемом виде. Механизм сопоставления ошибок по словарю находится в беклоге.

Если есть особый сценарий

У каждого уникального компонента "Страница заявки" может быть реализован особый сценарий поведения в случае успешной отправки заявки. Например, у [Онлайн Академии (доступ)] TODO задокументировать и дать ссылку при успехе происходит редирект на /account/online-academy

Наконец, если все условия выше исключены

Открываем экран успеха!