Дата: 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.
| Поле | Правило исходника | Отображение | | --- | --- | --- | | Название | После trim непустое | Звездочка, ошибка у контрола, ссылка в сводке | | Начало | Дата обязательна; проверка даты/времени выполняется BcDateTimeRange | Обязательный контрол и сообщение периода | | Окончание | Может отсутствовать при создании; при редактировании ранее заданное окончание нельзя снять | end-required зависит от hadEnd | | Часовой пояс | Имеет значение по умолчанию; список из timezones | Исходный BcSelect | | Бюджет | Положительная сумма | Обязательное денежное поле | | Цена | Положительная сумма; подпись зависит от CPM/CPC/CPV/CPA | Обязательное денежное поле | | Кликов всего | Обязательно только для CPC, больше 0 | Условное числовое поле | | Минимальные CTR/VTR | Необязательные; пусто означает без ограничения | Поля без звездочки и исходное пояснение | | Дневные показы | Необязательное положительное целое | Исходный числовой контрол | | erid | Необязателен; если введен, латиница/цифры, до 64 символов | Исходный контрол; disabled при выключенной маркировке | | Вид инвентаря | На уровне кампании требуется допустимый выбор | Отдельная ошибка и блокировка перехода из таргетинга | | Остальные фильтры таргетинга | Пусто обычно означает отсутствие ограничения; отдельные редакторы проверяют формат значений | Сохранены исходные подсказки и исключения | | Частота | Правила в отдельной форме; обязательное положительное значение строки, цели и периоды зависят от события | Исходный CampaignLimits |
Рекламодатель SaaS задается контекстом адреса, а не выдуманным полем формы. Цена каждой модели хранится отдельно. Смена модели не превращает CPM в цену клика: работает исходная логика и исходное подтверждение влияния.
Полный визуальный перенос основной DSP потребует отдельного стенда ее страницы, а не добавления ее полей в SaaS-мастер.
goStep, адрес содержит ?step= внутри hash-маршрута.TargetingEditor.save(true) при
переходе вперед и итоговом сохранении. Вид инвентаря проверяется до перехода.EDIT_DRAFT = false. Создание использует кампанию-черновик. Стенд не
подменяет это самодельным автосохранением каждой правки в localStorage.Сохранена концепция существующего мастера. Обновлены роли поверхностей, иерархия заголовков, размеры контролов, интервалы и геометрия: контролы 8 px, панели 12 px, окна 16 px; базовые контролы 40 px. Сводка остается справа на широком экране и переходит под форму на узком согласно исходному layout. Ошибки используют общий семантический цвет и связь aria-describedby. Не удалены ни поля, ни подписи обязательности, ни исходные формы дочерних объектов.
Справочники и объекты демонстрационные, не скопированы из пользовательских данных. Сохранение происходит в памяти стенда и сбрасывается при перезагрузке. Сценарии ошибок выбираются в шапке. Неподключенные операции возвращают явную ошибку 501, не имитируют успешную загрузку файла, транскодирование или серверную интеграцию. Внешние страницы сегментов, прогноза и групп не входят в редактор и показаны как граница стенда. Исходная продуктовая логика их ссылок сохранена.
Формы открытия, поля и проверки лимитов, флайтов и креативов используют оригинал. Наличие интерфейса загрузки не означает реализацию локального медиасервера. Точное совпадение с Figma не заявляется. Приложение и DEV/PROD не изменены.