Все версии

Редактор кампании V3: анализ реализованного интерфейса

Дата: 10.11.2026. Объект: существующий мастер SaaS DSP. Предыдущий макет workspace-v2 не является полным редактором и заменен ссылкой на этот стенд.

Почему прежний вариант был неполным

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

Источники и границы

Исполняется оригинальный src/editions/saas/pages/CampaignFormPage.vue, а не переписанная HTML-форма. Компоненты импортируются из дерева исходников проекта. source-contract.json фиксирует пути, SHA256 и подписи полей ключевых модулей. Ни исходная страница, ни дочерние компоненты не изменены. В стенде заменены оболочка, оформление и транспорт API, который обслуживает только локальные демонстрационные данные и никогда не отправляет запросы в продукт.

Также изучены src/pages/campaigns/CampaignFormPage.vue, CampaignBasicTab.vue, useCampaignFormRules.ts и utils/campaign-form/sections.ts основной DSP. Два редактора имеют разные контракты. Этот стенд воспроизводит SaaS, не выдает ее правила за правила основной DSP.

Структура мастера

| Шаг | Сохраненная структура | Источник | | --- | --- | --- | | 01 Основное | Название; начало и время; окончание и время; часовой пояс; маркировка ЕРИР | CampaignFormPage.vue | | 02 Бюджет | Модель оплаты, бюджет, цена модели, лимит кликов при CPC, дневные показы, распределение, расчет результата; условия CTR/VTR; отдельная форма лимитов и частоты | CampaignFormPage.vue, CampaignOutcome.vue, CampaignLimits.vue | | 03 Таргетинг | Гео и координаты, устройства, ОС/версии, производители, разрешение/диагональ, язык, связь/оператор, вид инвентаря, браузеры, идентификаторы, LMT/SDK, IP, контент/каналы/жанры, приложения, ключи, расписание и даты; дерево площадок | TargetingEditor.vue, PlacementsEditor.vue | | 04 Аудитории | Возраст, пол, дети, сегменты рекламодателя; включения и исключения | TargetingEditor.vue, part=audiences | | 05 Объявления | Флайты, периоды, наследование, объявления и их формы, библиотека, просмотр/правка, сравнение изменений, намерение после сохранения, готовность доставки | CampaignFlights.vue, CampaignCreatives.vue, ChangeReview.vue, DeliveryReadiness.vue |

Шаги в стенде принадлежат исходной странице. Скрытые шаги остаются смонтированы, поэтому значения не теряются при переходах. Секция корректировок показывается только при регистрации соответствующего модуля; стенд не придумывает модуль, который не зарегистрирован для SaaS.

Обязательные и необязательные поля SaaS

| Поле | Правило исходника | Отображение | | --- | --- | --- | | Название | После trim непустое | Звездочка, ошибка у контрола, ссылка в сводке | | Начало | Дата обязательна; проверка даты/времени выполняется BcDateTimeRange | Обязательный контрол и сообщение периода | | Окончание | Может отсутствовать при создании; при редактировании ранее заданное окончание нельзя снять | end-required зависит от hadEnd | | Часовой пояс | Имеет значение по умолчанию; список из timezones | Исходный BcSelect | | Бюджет | Положительная сумма | Обязательное денежное поле | | Цена | Положительная сумма; подпись зависит от CPM/CPC/CPV/CPA | Обязательное денежное поле | | Кликов всего | Обязательно только для CPC, больше 0 | Условное числовое поле | | Минимальные CTR/VTR | Необязательные; пусто означает без ограничения | Поля без звездочки и исходное пояснение | | Дневные показы | Необязательное положительное целое | Исходный числовой контрол | | erid | Необязателен; если введен, латиница/цифры, до 64 символов | Исходный контрол; disabled при выключенной маркировке | | Вид инвентаря | На уровне кампании требуется допустимый выбор | Отдельная ошибка и блокировка перехода из таргетинга | | Остальные фильтры таргетинга | Пусто обычно означает отсутствие ограничения; отдельные редакторы проверяют формат значений | Сохранены исходные подсказки и исключения | | Частота | Правила в отдельной форме; обязательное положительное значение строки, цели и периоды зависят от события | Исходный CampaignLimits |

Рекламодатель SaaS задается контекстом адреса, а не выдуманным полем формы. Цена каждой модели хранится отдельно. Смена модели не превращает CPM в цену клика: работает исходная логика и исходное подтверждение влияния.

Отличия основной DSP, которые нельзя смешивать с SaaS

Полный визуальный перенос основной DSP потребует отдельного стенда ее страницы, а не добавления ее полей в SaaS-мастер.

Переходы, ошибки, сохранение

  1. Вперед проверяется текущий шаг. Ошибки остаются у полей, в сводке и на шаге.
  2. Назад можно вернуться без потери значений. Выбор шага работает через исходный goStep, адрес содержит ?step= внутри hash-маршрута.
  3. Таргетинг и аудитории сохраняются исходным TargetingEditor.save(true) при переходе вперед и итоговом сохранении. Вид инвентаря проверяется до перехода.
  4. Итоговая проверка сохраняет всю форму и таргетинг, показывает изменения, состояние доставки и намерение оставить/запустить/остановить кампанию.
  5. Поле после исправления снимает собственную ошибку. Сводка ведет к нужному шагу и полю. Ошибка сохранения не очищает введенное.
  6. Редактирование по текущему исходнику не использует серверный автосейв: EDIT_DRAFT = false. Создание использует кампанию-черновик. Стенд не подменяет это самодельным автосохранением каждой правки в localStorage.
  7. Предупреждение об уходе и подтверждения принадлежат исходной форме.

Изменения оформления

Сохранена концепция существующего мастера. Обновлены роли поверхностей, иерархия заголовков, размеры контролов, интервалы и геометрия: контролы 8 px, панели 12 px, окна 16 px; базовые контролы 40 px. Сводка остается справа на широком экране и переходит под форму на узком согласно исходному layout. Ошибки используют общий семантический цвет и связь aria-describedby. Не удалены ни поля, ни подписи обязательности, ни исходные формы дочерних объектов.

Ограничения локального стенда

Справочники и объекты демонстрационные, не скопированы из пользовательских данных. Сохранение происходит в памяти стенда и сбрасывается при перезагрузке. Сценарии ошибок выбираются в шапке. Неподключенные операции возвращают явную ошибку 501, не имитируют успешную загрузку файла, транскодирование или серверную интеграцию. Внешние страницы сегментов, прогноза и групп не входят в редактор и показаны как граница стенда. Исходная продуктовая логика их ссылок сохранена.

Формы открытия, поля и проверки лимитов, флайтов и креативов используют оригинал. Наличие интерфейса загрузки не означает реализацию локального медиасервера. Точное совпадение с Figma не заявляется. Приложение и DEV/PROD не изменены.