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

Взаимодействие: провайдер - потребитель заданий

Сначала технические детали, а потом выводы из них.

Техническая подводка

Любой блок или поле, желающие получить инструкции к творческим заданиям, должны подписаться на стор

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()



Инструкция человеческим языком

При подготовке новой заявки нужно сообщить:

Хочу, чтобы инструкции к заданиям тянулись из мероприятия / части / направления / еще откуда-то

Тогда разработчик при деплое новой заявки подберет подходящие: стратегию заявки, готовые блоки, кастомные блоки; или же напишет новые хардкодные блоки, если готовые решения не подходят.

Вкратце:

Инструкции к заданиям должны идти из мероприятия?

Выключаем во всех блоках заявки активность провайдера. На картинке вкл, а надо выкл.

Настройки провайдера творческих заданий

Инструкции Амбассадора

Особый случай, вообще ничего не делаем, менеджер заявок захардкожен и сам управляет творческими заданиями.

Инструкции к заданиям тянутся из части/направления/откуда-то еще

Включаем активность провайдера заданий в блоке с выбором части/направления/чего-то (как на скрине выше).

Связка должна работать в превью моде.

Если связка не работает - значит что-то пошло не так. Лучше обратиться к разработке, особенно при настройке совершенно новой заявки.