Enhance template and scheduling functionalities: add PlanningRules to template endpoints and commands, implement repeat limits and audience filtering in scheduling logic, and update related data structures. Refactor frontend components to support new rules and improve user experience in channel management.
This commit is contained in:
@@ -341,6 +341,37 @@ const resources = {
|
||||
snapOff: 'нет',
|
||||
bumperConditionsHint:
|
||||
'Как часто ставить заставку и на каких переходах — условия элемента стыка, а не настройка канала.',
|
||||
resizeSlot: 'Потянуть за край — длительность',
|
||||
copyDay: 'Копировать день',
|
||||
copyDayFrom: 'Копировать {{day}} в:',
|
||||
copy: 'Копировать',
|
||||
layerVisible: 'Показывать слой',
|
||||
layerName: 'Название слоя',
|
||||
layerApplicability: 'Когда действует',
|
||||
applicabilityHint:
|
||||
'Разделы объединяются по ИЛИ: слой действует, если дата подходит хотя бы под одно условие. Ничего не заполнено — действует всегда.',
|
||||
applicabilityWeekdays: 'Дни недели',
|
||||
applicabilityDateRanges: 'Диапазоны дат',
|
||||
applicabilityAnnual: 'Ежегодно (месяц / день)',
|
||||
applicabilityDates: 'Конкретные даты',
|
||||
applicabilityNone: 'не задано',
|
||||
showForDate: 'Сетка на дату',
|
||||
allDates: 'Все слои',
|
||||
rules: 'Правила отбора',
|
||||
rulesHint:
|
||||
'Жёсткие фильтры: отсекают неподходящее до жребия. Как и правка сетки, эфир не двигают — нужно применить.',
|
||||
audienceWindows: 'Детское время',
|
||||
noAudienceWindows: 'Окон нет — возраст ничем не ограничен.',
|
||||
audienceWindowsHint:
|
||||
'В окне в эфир идёт контент не строже выбранной категории. Окно может переходить через полночь. Контент без категории не отсекается.',
|
||||
from: 'С',
|
||||
to: 'До',
|
||||
maxAudience: 'Не строже',
|
||||
repeatLimit: 'Потолок повторов',
|
||||
repeatWindowDays: 'Окно, суток',
|
||||
repeatMax: 'Не чаще, раз',
|
||||
repeatLimitHint:
|
||||
'Считается по уже записанной ленте. Если потолка достигли все кандидаты, слот всё равно заполняется: пустой эфир хуже раннего повтора.',
|
||||
preview: 'Предпросмотр',
|
||||
previewHide: 'Свернуть предпросмотр',
|
||||
previewHint: 'Прогон по текущим правилам: ничего не пишется, курсоры слотов не двигаются.',
|
||||
@@ -422,6 +453,7 @@ const resources = {
|
||||
CooldownExhausted: 'Остывание отсекло всех',
|
||||
RepeatSourceEmpty: 'Нечего повторять',
|
||||
FallbackEmpty: 'Нечем закрыть паузы',
|
||||
CandidatesFiltered: 'Возрастной потолок отсёк всех',
|
||||
},
|
||||
|
||||
title: 'Каналы',
|
||||
@@ -509,19 +541,7 @@ const resources = {
|
||||
preferredNone: 'Окна не заданы — предпочтений по времени нет.',
|
||||
preferredAddWindow: 'Добавить окно',
|
||||
preferredBadRange: 'начало ≥ конца',
|
||||
ads: 'Реклама',
|
||||
pickAd: 'Выберите ролик',
|
||||
noAds: 'Пул рекламы пуст',
|
||||
overrides: 'Марафоны / override',
|
||||
modes: { Exclusive: 'Эксклюзив', Boost: 'Буст' },
|
||||
overrideRecurrence: 'Повтор',
|
||||
recurrenceOneTime: 'Разово',
|
||||
recurrenceWeekly: 'Еженедельно',
|
||||
from: 'С',
|
||||
to: 'По',
|
||||
noOverrides: 'Override не заданы',
|
||||
schedule: 'Расписание (12 ч)',
|
||||
noSchedule: 'Расписание ещё не построено — нажмите «Пересобрать»',
|
||||
noSchedule: 'Расписание ещё не построено',
|
||||
},
|
||||
maintenance: {
|
||||
title: 'Обслуживание',
|
||||
@@ -918,6 +938,37 @@ const resources = {
|
||||
snapOff: 'off',
|
||||
bumperConditionsHint:
|
||||
'How often a bumper is inserted and on which transitions is a junction-element condition, not a channel setting.',
|
||||
resizeSlot: 'Drag the edge to change duration',
|
||||
copyDay: 'Copy day',
|
||||
copyDayFrom: 'Copy {{day}} to:',
|
||||
copy: 'Copy',
|
||||
layerVisible: 'Show layer',
|
||||
layerName: 'Layer name',
|
||||
layerApplicability: 'When it applies',
|
||||
applicabilityHint:
|
||||
'Sections are OR-ed: the layer applies when the date matches at least one condition. Nothing filled in — it always applies.',
|
||||
applicabilityWeekdays: 'Weekdays',
|
||||
applicabilityDateRanges: 'Date ranges',
|
||||
applicabilityAnnual: 'Yearly (month / day)',
|
||||
applicabilityDates: 'Specific dates',
|
||||
applicabilityNone: 'not set',
|
||||
showForDate: 'Grid for date',
|
||||
allDates: 'All layers',
|
||||
rules: 'Candidate rules',
|
||||
rulesHint:
|
||||
'Hard filters: they cut out what is not allowed before the draw. Like grid edits, they do not move the air — apply to take effect.',
|
||||
audienceWindows: 'Family hours',
|
||||
noAudienceWindows: 'No windows — the age is not limited.',
|
||||
audienceWindowsHint:
|
||||
'Inside a window only content no stricter than the chosen category airs. A window may cross midnight. Content with no category is never dropped.',
|
||||
from: 'From',
|
||||
to: 'To',
|
||||
maxAudience: 'No stricter than',
|
||||
repeatLimit: 'Repeat cap',
|
||||
repeatWindowDays: 'Window, days',
|
||||
repeatMax: 'At most, times',
|
||||
repeatLimitHint:
|
||||
'Counted against the already recorded tape. If every candidate hits the cap the slot is still filled: empty air is worse than an early repeat.',
|
||||
preview: 'Preview',
|
||||
previewHide: 'Hide preview',
|
||||
previewHint: 'A run against the current rules: nothing is written, slot cursors do not move.',
|
||||
@@ -993,6 +1044,7 @@ const resources = {
|
||||
CooldownExhausted: 'Cooldown ruled out every candidate',
|
||||
RepeatSourceEmpty: 'Nothing to repeat',
|
||||
FallbackEmpty: 'Nothing to fill pauses with',
|
||||
CandidatesFiltered: 'The age cap ruled out every candidate',
|
||||
},
|
||||
|
||||
title: 'Channels',
|
||||
@@ -1080,19 +1132,7 @@ const resources = {
|
||||
preferredNone: 'No windows set — no time preference.',
|
||||
preferredAddWindow: 'Add window',
|
||||
preferredBadRange: 'start ≥ end',
|
||||
ads: 'Ads',
|
||||
pickAd: 'Pick an ad',
|
||||
noAds: 'Ad pool is empty',
|
||||
overrides: 'Marathons / overrides',
|
||||
modes: { Exclusive: 'Exclusive', Boost: 'Boost' },
|
||||
overrideRecurrence: 'Repeat',
|
||||
recurrenceOneTime: 'One-time',
|
||||
recurrenceWeekly: 'Weekly',
|
||||
from: 'From',
|
||||
to: 'To',
|
||||
noOverrides: 'No overrides set',
|
||||
schedule: 'Schedule (12h)',
|
||||
noSchedule: 'Schedule not built yet — click “Rebuild”',
|
||||
noSchedule: 'Schedule not built yet',
|
||||
},
|
||||
maintenance: {
|
||||
title: 'Maintenance',
|
||||
|
||||
Reference in New Issue
Block a user