application-manager
Неактуально
ApplicationManager
Вот интерфейс IApplicationManager
.
Здесь перечислены лишь те поля, с которыми взаимодействует внешний код. Внутри каждого конкретного ApplicationManager'а могут быть любые другие поля и методы.
export interface IApplicationManager {
isPreviewMode: boolean;
isNeedsEventPartsAlways?: boolean;
initialize: () => Promise<void>;
cleanup: () => void;
isMultipleSteps: boolean;
finalData: ApplicationModuleContentFinal;
blockManagerList: IBlockManager[];
isDraft: boolean;
saveDraft: () => Promise<boolean>;
send: () => Promise<boolean>;
store: Writable<Record<string, unknown>>;
isDraftSavedStore: Writable<boolean>;
event: Tavrida.Event;
eventForm: Tavrida.EventForm;
getEventPartsStore: () => Readable<Tavrida.EventPart[]>;
eventParts: Tavrida.EventPart[];
currentApplication: Tavrida.EventParticipant;
agreementManager: IAgreementManager;
creativeTaskManager: ICreativeTaskManager;
getCreativeTaskStore?: () => Writable<Tavrida.CreativeTask[] | null>;
getBgSuccessStore: () => Writable<string>;
getBgHeaderStore: () => Writable<string>;
getBgStickyStore: () => Writable<string>;
getEventPartID: () => string | null;
currentEventPartIDStore: Writable<string | null>;
setEventPartID: (eventPartID: string | unknown) => void;
}
isPreviewMode
Прокидывается при создании инстанса, если URL.pathname=/preview
или есть серч параметр ?preview=1
isNeedsEventPartsAlways
Выставьте этот флаг в конструкторе, чтобы eventParts'ы текущего ивента подтянулись до инициализации заявки (и были сразу доступны в поле applicationManager.eventParts
)
initialize()
Метод, который наследуют у ApplicationManagerRegular остальные. Нужно оверлоадить некоторые из методов, чтобы поменять поведение.
class ApplicationManagerRegular {
async initialize() {
// Именно эти методы стоит оверлоадить, чтобы изменить поведение заявки
await this.checkEventAndForm()
await this.createEventPartsStoreIfNeeded()
await this.subscribeToUser()
await this.checkIsAllowedInitial()
await this.getApplications()
await this.getCurrentApplicationOrCreateOne()
this.setStores()
//..
}
}
Внутри любого из этих методов нужно кинуть ApplicationV2InitError, чтобы вызвать попап с ошибкой.
Overload - getEventAndFormId
Поменять способ получения ID ивента и формы
const { eventId, formId, isGetAnyFirstForm } = this.getEventAndFormId()
Overload - checkIsAllowedInitial
Этот метод бросает ошибки инициализации ApplicationV2InitError, если что-то не так.
Идеальный плесйхолдер для того, чтобы выкинуть попап "ивент неактивен, часть неактивна, даты регистрации прошли".
Overload - getCurrentApplicationOrCreateOne
Метод выставляет this.currentApplication
Создает новый черновик, берет существующий или выбрасывает попапы об ошибке. Уникальные сценарии для каждой стратегии писать именно здесь.
cleanup()
Метод, который нужно вызывать в onDestroy свелт компонента. Он подчищает
isMultipleSteps
Выставляется, если шагов больше 1. Это поле читают компоненты загрузки файлов.
finalData
Лучше посмотреть в коде.
Грубо говоря, это тот же массив шагов, как приходит из CMS, но вместо blockId у каждого блока есть svelte-component и BlockManager.
blockManagerList
Плоский массив IBlockManager. Для удобства.
isDraft
Черновик ли. Спорное поле, не совсем нужное.
Влияет на:
- отображение кнопки "Сохранить черновик"
- При переходе между шагами, если это не черновик, сразу прыгает, без попытки сохранить черновик.
saveDraft()
Пытается сохранить черновик, пользуясь методом onSaveCommon
Если ловит ошибки - открывает попап с ошибками и возвращает false
Если успешно сохраняет - открывает попап об успешном сохранении черновика и возвращает true,
Если ничего не поменялось - возвращает true.
Далее функции перехода по шагам отлаливают ответ true/false и решают, переходить на следующий шаг.
send()
Пытается отправить заявку, пользуясь методом onSaveCommon
Если ловит ошибки - открывает попап с ошибками и возвращает false
Если ошибок нет - возвращает true
Далее функция отправки заявки ловит true/false, и если true - выводит экран успеха.
store
Стор с participant.formResult.values
текущей заявки.
То есть значения полей заявки, заполняемых юзером.
При инициализации в него подтягиваются значения с бека, а дальше синхронизируются при каждом сохранении черновика.
На этот стор подписан стор каждого блока. При обновлении ApplicationManager.store, обновятся и значения внутри блоков, трансфомированные с помощью метода BlockManager.fromApp(application)
В превью моде некоторые Стратегии прокидывают заглушечные значения, например, EventPartInURL прокидывает partID из ссылки.
isDraftSavedStore
Стор для обратной совместимости с легаси кодом в ApplicationV2FileUploadComponent.
По дефолту true.
При загрузке файла компонент выставляет в false - и благодаря этому отображается сообщение
Чтобы завершить загрузку файла, сохрани черновик
После сохранения черновика стор выставляется обратно в true
event
Ивент в том виде, в каком приходит с бека АИС Таврида.
Если страница не упала в 404, он там точно будет.
От него обычно требуются ID и список форм.
eventForm
Форма заявки в том виде, в каком приходит с бека АИС Таврида.
Если страница не упала в 404, она там точно будет.
От нее требуются ID и список полей с настройками (например, для полей типа Загрузка файла или Список чекбоксов).
getEventPartsStore()
Возвращает стор с частями мероприятия.
Если стор не был создан при инициализации, создается, и возвращается.
Метод используется для блоков и полей заявки, где есть нужен список частей мероприятия.
eventParts
В этом поле могут быть, а могут и не быть части мероприятия.
Зависит от того, когда был создан стор.
Чтобы в eventParts всегда гарантированно лежали части мероприятия, и стор был наполнен сразу при инициализации, нужно выполнить одно из условий:
- Сам ApplicationManager должен иметь в конструкторе this.isNeedsEventParts = true
- Один из блоков заявки должен иметь в конструкторе this.isNeedsEventParts = true
- Одно из полей одного из кастомных блоков должно иметь в конструкторе this.isNeedsEventParts = true
currentApplication
Текущая заявка (eventParticipant в АИС)
Нужна для ID и participantTypeID
agreementManager
Инстанс [AgreementManager]
creativeTaskManager
Инстанс [CreativeTaskManager]
getCreativeTaskStore?()
Опциональный метод. Используется в стратегии Ambassadors
Если есть - CreativeTaskManager считает приоритетным именно тот стор, который возвращается в этом методе.
Подробнее в [CreativeTaskManager]
getBgSuccessStore, getBgHeaderStore, getBgStickyStore
Это сторы, предоставляющие текущую картинку для экрана результатов, шапки и прогресс бара моб/планшет, в зависимости от настроек CMS и текущей ширины экрана.
getEventPartID
Метод получения текущей части мероприятия.
Используется при инициализации.
Обычно берет значение из ?part={partID}
currentEventPartIDStore
Стор string | null
Пока нужен только для чекбокса акселераторов.
setEventPartID
Метод установки текущей части мероприятия. Текущее поведение в некоторых стратегиях:
- Сетает в
?part={partID}
черезhistory.replaceState
- Сетает стор this.currentEventPartIDStore