Взаимодействие: провайдер - потребитель заданий
Сначала технические детали, а потом выводы из них.
Техническая подводка
Любой блок или поле, желающие получить инструкции к творческим заданиям, должны подписаться на стор
const creativeTasksStore = applicationManager.creativeTaskManager.getStore()
У любой заявки есть менеджер творческих заданий, просто там, где это не нужно, он не работает и не тратит ресурсы устройства пользователя на вычисления.
Как CreativeTaskManager наполняет стор, по приоритету:
1. ApplicationManager getCreativeTaskStore()
Такой есть у стратегии Амбассадоры, там менеджер заявок сам рулит творческими заданиями. Подробнее
2. Если нет блока-инициатора творческих заданий
Значения берутся из мероприятия (если есть)
3. Если блок-инициатор есть
Менеджер блока-инициатора должен предоставить метод
BlockManager.getCreativeTaskStore()
Что за блок-инициатор?
Во время инициализации менеджера творческих заданий, он проходится по всем блокам и у каждого блока смотрит вот на эти настройки на скриншоте.
Если выставлено Активно, этот блок является провайдером.
Логика предоставления заданий
Всегда захардкожена тем или иным образом.
1. Логика прописана в hardcoded блоке разработчиком
TODO добавить ссылку
Например, блок [Выбор практики Координатора: поток, направление, аргументация]. В нем при выборе направления из CMS меняется предоставляемое заявке творческое задание.
С помощью метода
BlockManager.getCreativeTasksStore()
2. Логика прописана в одном из полей custom блока
Например, блок на скриншоте выше - Выбор Акселератора - кастомный. Но в нем есть поле Выбор части мероприятия.
У этого поля есть метод
class FieldManager {
bindGetCreativeTaskStoreFromFieldToBlock({
blockStore,
getValueFromBlockStore = () => {},
}) {}
}
Метод возвращает стор, в котором в зависимости от значения поля выставляются текущие инструкции к заданиям.
В то же время кастомный блок идет по порядку и берет первое попавшееся поле, у которого есть метод
FieldManager.bindGetCreativeTaskStoreFromFieldToBlock()
и в своем методе
BlockManager.getCreativeTasksStore()
возвращает именно тот стор, который возвращает поле из своего FieldManager.bindGetCreativeTaskStoreFromFieldToBlock()
Попап "Точно хотите изменить?"
Настройки попапа здесь же. Заголовок, описание, текста кнопок.
Как работает попап "Точно хотите изменить?" ?
Вкратце - в блоке должно быть зашито умение вызывать этот попап.
Если в заявке есть хотя бы один потребитель - попап вызовется при смене (не при выборе с нуля, когда пусто) с тем копирайтом, который заполнен в штуке на скрине выше.
Пока реализовано только для инпута Select. Пример в hardcoded блоке:
<script>
export let blockManager
const store = blockManager.getStore()
const eventPartsStore = blockManager.applicationManager.getEventPartsStore()
const handleChangePart = getHandleChangeForClearInitiators({
blockManager,
set: value => {
blockManager.applicationManager.setEventPartID(value)
store.update(prev => ({
...prev,
partID: value,
}))
},
isOkWithoutConfirm: value => !$store.partID || $store.partID === value,
})
</script>
<Select
id="coordinatorsPartId"
label={blockManager.fieldPart.label[$locale]}
placeholder={blockManager.fieldPart.placeholder[$locale]}
store={eventPartsStore}
error={error.partID && locales.error.defaultSelect[$locale]}
asyncConfirmBeforeSelect={handleChangePart}
value={$store.partID}
/>
В поле Выбор части мероприятия почти то же самое. Любой кастомный блок с этим полем легко станет провайдером и будет выводить попап "Точно хотите изменить?" при попытке смены и сбрасывать значения, если соблюсти условия.
Потребитель заданий
Хотя бы один блок должен быть потребителем творческих заданий, чтобы:
Инструкции к заданиям отображались
При смене значения провайдера (обычно при смене части мероприятия или направления) сбрасывались загруженные файлы в блоках - потребителях творческих заданий
1. Подготовленный для этого хардкодный блок
Как правило, это блок Творческое/Видеовизитка для конкретной заявки, например
Должно быть выставлено this.isCreativeTaskConsumer=true
в конструкторе, либо в initialize()
class BlockManager extends AnyBlockManager {
constructor(props) {
super(props)
this.isCreativeTasksConsumer = true
}
async initialize() {
this.isCreativeTasksConsumer = true
}
clear() {
// тут сбрасывается значение
}
}
Должен быть метод clear()
Если метода clear() у потребителя заданий не будет, об этом выскочит ошибка в консоли
Получен стор заданий и инфа о том, нужно ли показывать плашку, если стор пустой (значит не выбрано направление/часть/что-то, или у направления/части/чего-то нет инструкций)
const creativeTasksStore = blockManager.applicationManager.creativeTaskManager.getStore()
const hasCreativeTasksFromDirection = blockManager.applicationManager.creativeTaskManager.hasCreativeTasksNotFromEvent
И все это прокинуто в компонент загрузки файлов или куда угодно
<ApplicationV2FileUploadComponent
...
creativeTasks={$creativeTasksStore}
{hasCreativeTasksFromDirection}
...
/>
2. Кастомный блок, в котором поля настроены особым образом
Кастомный блок считается потребителем заданий, если в нем есть хотя бы одно поле, у которого включен соответствующий флаг.
Если хотя бы одно такое поле есть, this.isCreativeTaskConsumer = true
кастомному блоку выставляется автоматически.
Дальше поле делает внутри себя то же самое, что хардкодный блок. Подписывается на стор и показ плашки и рендерит компонент загрузки файла.
Чтобы сбрасывалось значение, у кастомного блока есть метод clear()
Метод clear()
у кастомного блока всем полям проставляет соответствующее
FieldManager.getInitialValue()
Инструкция человеческим языком
При подготовке новой заявки нужно сообщить:
Хочу, чтобы инструкции к заданиям тянулись из мероприятия / части / направления / еще откуда-то
Тогда разработчик при деплое новой заявки подберет подходящие: стратегию заявки, готовые блоки, кастомные блоки; или же напишет новые хардкодные блоки, если готовые решения не подходят.
Вкратце:
Инструкции к заданиям должны идти из мероприятия?
Выключаем во всех блоках заявки активность провайдера. На картинке вкл, а надо выкл.
Инструкции Амбассадора
Особый случай, вообще ничего не делаем, менеджер заявок захардкожен и сам управляет творческими заданиями.
Инструкции к заданиям тянутся из части/направления/откуда-то еще
Включаем активность провайдера заданий в блоке с выбором части/направления/чего-то (как на скрине выше).
Связка должна работать в превью моде.
Если связка не работает - значит что-то пошло не так. Лучше обратиться к разработке, особенно при настройке совершенно новой заявки.