Layout-ы
Почему это важно. Layout — это экран кейса. Он решает, какие поля, виджеты и кнопки видит аналитик, в каком порядке и при каких условиях — на тип инцидента, на представление и (опционально) на человека. Хороший layout превращает стену данных в поверхность триажа; плохой хоронит единственное важное поле. Эта глава — полный справочник конструктора; она глубже, чем обзор §3.2 руководства администратора.
Маршрут: /admin/layouts (список) · /admin/layouts/:layoutId/edit и
/admin/layouts/incident-types/:incidentTypeId (редактор) · Права:
layouts.view смотреть и персонализировать, layouts.manage редактировать
управляемые layout-ы · Модуль: cases
7.1. Модель layout-а
Четыре идеи определяют, что такое layout. Разберитесь в них, и остальное в конструкторе последует.
Представления (режимы). Один layout несёт четыре независимых представления, переключаемых вкладками наверху конструктора:
| Представление | Назначение |
|---|---|
| Incident Summary | Полный экран кейса. Организован во вкладки, каждая держит сетку секций. Это единственное представление со вкладками. |
| «New» / «Edit» Form | Форма, показываемая при создании или редактировании кейса. Плоский список секций. |
| «Close» Form | Форма, показываемая при закрытии кейса (диспозиция, сводка закрытия и т. д.). |
| Incident Quick View | Компактный снимок, показываемый в превью и боковых заглядываниях. |
Scope. Layout привязан к одному типу инцидента (селект Incident Type в конструкторе). Платформа поставляет встроенный дефолт для каждого типа, и вы можете прикрепить свой.
Владение — управляемый vs персональный.
- Управляемый layout глобален: его видит каждый с этим типом инцидента. Создание
и редактирование управляемых layout-ов требуют
layouts.manage. - Персональный layout — приватное переопределение для одного пользователя. Любой
аналитик с
layouts.viewможет сделать его (из дефолта) и редактировать; он влияет только на его собственные экраны кейсов.
Состояние — attached / detached / duplicated. Каждый управляемый layout несёт состояние жизненного цикла, показанное как пилюля в списке и в заголовке конструктора:
| Состояние | Значение | Редактируем? |
|---|---|---|
| attached | Всё ещё связан со своим шаблоном (встроенным системным дефолтом, с которого стартует тип). | Нет — сначала Duplicate или Detach. |
| detached | Независимый, редактируемый дефолт, отрезанный от своего шаблона. | Да. |
| duplicated | Независимая копия, сделанная из другого layout-а. | Да. |
Layout также несёт тег content source — system (встроенный дефолт) или custom (ваш). (marketplace — зарезервированный тег для контента, поставленного паком; о том, как паки и layout-ы соотносятся в этом релизе, см. §7.11.)
Как кейс выбирает свой layout (порядок резолвинга). Когда аналитик открывает кейс, платформа резолвит layout в этом порядке и останавливается на первом попадании: (1) layout, прикреплённый напрямую к этому конкретному кейсу; (2) персональный layout текущего пользователя для типа инцидента кейса; (3) управляемый дефолт типа инцидента; (4) встроенный виртуальный дефолт для этого типа. Виртуальный дефолт генерируется на лету (состояние attached, источник system) и это то, что вы видите, пока никто не сохранил кастомный дефолт.
7.2. Рабочее пространство layout-ов (список)
/admin/layouts открывает рабочее пространство: поле поиска, фильтр по типу
инцидента, пилюли-счётчики и четыре вкладки. Действия справа сверху: Import
Personal, а с layouts.manage — Import Managed и + New Detached.
| Вкладка | Что перечисляет | Ключевые действия строки |
|---|---|---|
| Defaults | По одной строке на тип инцидента: его дефолтный layout (тег Editable default или Virtual default) и любую вашу персональную копию. | Edit / View дефолт; Create Personal или Open Personal. |
| Versions | Каждый сохранённый управляемый layout по всем типам, с флагом Default, Source, State и числом кейсов. | Open version, Create personal, Export, Delete (layouts.manage). |
| Personal | Ваши собственные персональные layout-ы, каждый отмечает дефолт, на котором основан. | Open personal, Export, Delete. |
| List View | Конфигурация inline-полей значений — см. §7.7. Эта вкладка не пикер колонок. |
Создание layout-ов из списка:
- + New Detached — совершенно новый управляемый layout для выбранного типа инцидента (стартует detached и редактируемым).
- Create Personal — клонирует дефолт типа в приватный layout, который можно редактировать свободно, не трогая то, что видят другие.
- Import Managed / Import Personal — загрузить ранее экспортированный пакет
layout-а (
.layout.json) как глобальный или персональный layout соответственно.
7.3. Конструктор — анатомия
Открытие layout-а на редактирование даёт полноэкранный конструктор. Заголовок несёт идентичность и действия уровня layout-а; тело несёт библиотеку, холст и панель свойств.
Заголовок:
| Элемент | Назначение |
|---|---|
| Name | Редактируемое имя layout-а (недоступно, пока вы не можете сохранить этот layout). |
| Status pills | Content source, состояние, маркеры virtual / personal, привязанный тип инцидента и маркер default. Цветная заметка объясняет, когда layout read-only (attached, virtual, personal, или у вас нет layouts.manage). |
| Incident Type (select) | Тип инцидента, к которому привязан layout (скрыт в редакторе дефолта на тип, где он фиксирован). |
| History | Открывает выдвижную панель истории версий (§7.8). Показана только для сохранённых layout-ов. |
| Settings | Открывает редактор Advanced JSON — сырую конфигурацию layout-а, синхронизированную с визуальным холстом в обе стороны. |
| More (⋯) | Export, Duplicate, Detach (только для attached управляемых layout-ов), Delete. |
| Save | Сохраняет layout. Недоступно, когда layout read-only. |
| Close (✕) | Возвращает в список. |
Read-only — это фича, а не баг. Если Save недоступна и заголовок показывает заметку attached или virtual, это защитное ограждение: attached или встроенный дефолт нельзя перезаписать на месте. Duplicate его (независимая копия) или Detach его (отрезать от шаблона), чтобы получить редактируемый layout. Сохранение virtual-дефолта в первый раз материализует его в реальный, редактируемый detached-дефолт для этого типа инцидента.
7.4. Библиотека
Левая панель Library (переключается Show Library / ✕) — источник перетаскиваемых строительных блоков. Поле поиска фильтрует внутри активной вкладки библиотеки:
- Sections — пресеты секций (перетащите на холст, чтобы добавить секцию).
- Fields and Buttons — New Button, каталог полей инцидента (каждое системное и кастомное поле из Главы 6) и, ниже разделителя, библиотека виджетов.
- Tabs — + New tab (только представление Summary).
Пресеты секций (14):
| Пресет | Добавляет |
|---|---|
| + New Section | Пустую секцию полей (засеяно поле Title). |
| Attachments | Секцию виджета доказательств/вложений. |
| Child Incidents | Секцию виджета связанных/дочерних инцидентов. |
| Evidence | Секцию виджета доски доказательств. |
| Dynamic Section | Секцию markdown/HTML, отрисованную скриптом (§7.9). |
| Incident Timeline | Виджет таймлайна событий. |
| Notes | Виджет комментариев/заметок. |
| Indicators (IOC) | Виджет таблицы IOC. |
| Email Headers | Виджет анализа заголовков писем. |
| Email Preview | Виджет превью отрендеренного тела письма. |
| Playbook Console | Виджет выполнения плейбука. |
| Team Members | Виджет назначенных участников команды. |
| Enrichment | Виджет результатов обогащения индикаторов. |
| Quick Actions | Секцию действий реагирования в один клик. |
Библиотека виджетов (22) — перетаскиваемые отдельные виджеты:
| Виджет | Виджет | Виджет |
|---|---|---|
| Incident Timeline | Notes / Comments | Notes |
| Work Plan (tasks) | Evidence | Evidence Board |
| Linked Incidents | Canvas | Dynamic Section |
| Email Headers | Email Preview | Playbook Console |
| Team Members | IOC Table | SLA Status |
| Raw Data | Markdown Block | Enrichment |
| Quick Actions | Investigation Workbook | Linked Assets (GRC) |
| Business Impact (GRC) |
GRC-виджеты. Linked Assets и Business Impact появляются в библиотеке независимо от того, лицензирован ли модуль
grc, но отрисовывают данные на кейсе, только когда GRC активен. Business Impact показывает радиус поражения кейса и рекомендацию по приоритету из графа активов — см. гайд аналитика §4.5 и гайд GRC.
7.5. Холст — механика сетки
Холст — это 12-колоночная сетка. Каждая секция занимает прямоугольник, определённый x (колонка, 0–11), y (строка), w (ширина в колонках, 1–12) и h (высота в строках). Высота строки фиксирована; секции защёлкиваются в сетку.
- Добавляйте секции тремя способами: перетащите пресет из библиотеки, используйте панель Quick add (+ Fields Section, + Indicators, + Timeline, + Notes, + Email Headers и More… для остального) или, на пустом холсте, центральные кнопки Add ….
- Двигайте секцию, перетаскивая её ручку заголовка; изменяйте размер ручками снизу и снизу-справа. Секции компактируются вертикально в свободное место.
- Точное размещение доступно в панели свойств секции — вводы Canvas Grid X / Y / Width / Height (ширина ограничена 12, высота 2–12).
- Вкладки Summary. В представлении Incident Summary над холстом сидит ряд вкладок. Перетаскивайте для переупорядочивания; + New tab добавляет одну; меню ⋯ каждой вкладки предлагает Rename, Duplicate, Edit tab settings, Hide/Show, Format for exporting (A4), Show/Hide empty fields и Delete. У остальных трёх представлений вкладок нет — просто плоская сетка секций.
- Preview. Переключатель Preview (справа сверху) меняет редактируемый холст на read-only, верную рантайму отрисовку текущего представления (с бейджем PREVIEW), чтобы вы видели layout так, как увидел бы аналитик, до сохранения. Edit Mode переключает обратно.
Выбор вкладки, секции, поля, кнопки или виджета открывает панель свойств (правую выдвижную панель) для этого элемента — разбирается далее.
7.6. Панель свойств
Выдвижная панель свойств меняется с тем, что вы выбираете. Каждый элемент делит общий блок; каждый вид добавляет свой.
Общее для каждого элемента:
- Name / Label — видимый заголовок (заголовок секции/вкладки/виджета или подпись поля/кнопки).
- Visible to roles — ввод тегов; оставьте пустым для «всех» или перечислите роли
(
admin,analyst, …), чтобы ограничить элемент. - Hidden — скрыть элемент напрочь.
- Display Filter — правило условной видимости: field path и equals
value. Элемент показывается, только когда это поле кейса равно этому значению
(напр. показать секцию Closing Information, только когда
statusравноclosed).
Более богатые условия живут в JSON. Визуальный Display Filter экспонирует типичный случай поле = значение. Подлежащее правило поддерживает больше операторов — не-равно, в списке, не в списке, truthy, falsy и exists — которые вы авторите через редактор Settings → Advanced JSON (
visibleWhen). Встроенные дефолты используют их; например, секция Closing Information поставляется с{"field":"status","in":["resolved","closed"]}.
Когда выбрана секция, дополнительно:
- Section Kind — Fields, Buttons или Widgets (что держит секция).
- Section Layout — Rows / Grid или Cards / Stack.
- Columns — 1, 2 или 3 (для секций полей).
- Show empty fields — отрисовываются ли поля без значения.
- Canvas Grid — вводы размещения X / Y / Width / Height (§7.5).
Когда выбрано поле, дополнительно:
- Field Data Path — machine-имя, из которого читает поле (напр.
acme_ticket_id; см. Главу 6 §6.4). - Help Text, Placeholder — встроенные подсказки.
- Field Type — тип отрисовки (text, long_text, number, boolean, selects, date_time, markdown, html, user, role, url, attachment, grid, severity, status).
- Required / Read only — переключатели на поле. Они взаимодействуют с представлением: поле может быть редактируемым в форме Edit и read-only в Summary.
Когда выбрана кнопка, дополнительно:
- Button Action — Custom Script, Assign to Me, Update Incident, Close Incident или Switch View.
- Button Script — для действия Custom Script, автоматизация для запуска (из каталога layout-действий).
- Confirmation — опциональное подтверждение, показываемое до срабатывания действия.
Что могут триггерить кнопки-действия. Assign to Me забирает кейс; Update Incident патчит поля кейса (встроенные дефолты используют его для установки статуса, напр. эскалации); Close Incident открывает поток закрытия; Switch View прыгает к другому представлению; Custom Script гоняет layout-действие против кейса (это требует
cases.editв рантайме). Предустановленные параметры полей (вроде статуса, который ставит кнопка Update Incident) несутся на кнопке и редактируются через Advanced JSON.
Когда выбран виджет, дополнительно:
- Widget Type — сменить виджет на любой из библиотеки.
- Dynamic Section Script — для виджета Dynamic Section, автоматизация, которая его отрисовывает (§7.9).
Когда выбрана вкладка (представление Summary), дополнительно:
- Tab Options — Default или Format for exporting (A4 export layout).
- Show empty fields для всей вкладки.
У выдвижной панели каждого элемента также есть Duplicate и Delete в заголовке.
7.7. List View / inline-поля значений
Вкладка List View рабочего пространства (и та же панель под Objects Setup → More settings → Inline values) — это не редактор колонок таблицы кейсов. Она настраивает inline-поля значений — маленькие, редактируемые на месте чипы значений, показываемые в очереди кейсов и сводках.
- Левая панель — список полей инцидента с переключателем на каждое поле (включить его как inline-значение). Поля-вложения исключены.
- Выберите поле, чтобы настроить его справа: Display order (число) и Display style — Text или Tag.
Используйте её, чтобы вывести горстку высокосигнальных полей (severity, вердикт, id тикета) как компактные, быстро редактируемые чипы, не открывая полный кейс.
7.8. Версии, история и откат
Каждое сохранение записывается. Кнопка History конструктора открывает выдвижную панель, перечисляющую недавние ревизии layout-а (взятые из журнала аудита, новейшие сверху) с превью JSON.
- Каждую запись можно откатить: Roll back восстанавливает хранимую конфигурацию
этой ревизии как текущий layout. Откат требует
layouts.manageи предлагается только для управляемых (не персональных) layout-ов. - Откат сам по себе — изменение (он пишет новую ревизию), так что он обратим — можно откатиться вперёд, откатившись к более поздней записи.
7.9. Динамические секции и кнопки-действия
Два элемента конструктора делегируют автоматизациям, позволяя layout-ам показывать вычисляемый контент и гонять логику:
- Dynamic Section (виджет / пресет Dynamic Section) отрисовывает вывод layout-section-автоматизации для текущего кейса — markdown, HTML или таблицу. Выберите скрипт в выпадающем списке Dynamic Section Script виджета. Каталог взят из включённых автоматизаций с тегом для секций layout-а; платформа выполняет скрипт на каждый кейс и ненадолго кеширует результат.
- Кнопки-действия с действием Custom Script гоняют layout-action- автоматизацию против кейса при клике. Это две половины динамических layout-ов: секция, которая показывает вычисленные данные, и кнопка, которая что-то делает.
Это те же автоматизации, что вы пишете в других местах. Каталог скриптов layout-а — это просто подмножество автоматизаций со scope
layout-section(для динамических секций) илиlayout-action(для кнопок), оставленных включёнными. Их авторинг — часть workflow автоматизации/контента, а не конструктора layout-ов.
7.10. Панели War Room — как они связаны
War Room Panels Builder (гайд администратора §3.3,
/admin/war-room) — это отдельный конструктор с пересекающейся целью. Различие:
- Layout-ы формируют экран детали кейса — его вкладки, секции, поля, кнопки и виджеты по четырём представлениям.
- Панели War Room формируют вспомогательные панели рядом с лентой расследования (хронологическим журналом war-room) — настраиваются на тип инцидента из каталога виджетов с режимами script / automation.
Оба на тип инцидента и оба размещают виджеты, но целят в разные поверхности кейса. Используйте layout-ы для структурированного представления кейса; используйте панели War Room для инструментов, которые аналитик хочет рядом с живой лентой.
7.11. Переносимость — экспорт, импорт, дублирование, отвязка
- Export скачивает layout как переносимый JSON-пакет (
schema: soarforge.layout) — файл.layout.json, который можно версионировать или переносить между инсталляциями. - Import Managed загружает пакет как новый глобальный layout (
layouts.manage); Import Personal загружает его как ваше приватное переопределение (layouts.view). - Duplicate создаёт полностью независимую копию (состояние duplicated) — безопасный способ форкнуть attached или встроенный layout для редактирования. (API clone ведёт себя идентично — независимая копия, а не живая связь.)
- Detach отрезает attached управляемый layout от его шаблона, чтобы можно было редактировать его на месте; duplicated-layout уже независим и не может быть отвязан снова.
- Delete заблокирован для attached-layout-ов, для активного дефолта и для layout-ов, уже назначенных кейсам — сначала duplicate или detach, либо переназначьте дефолт.
Content-паки и layout-ы. В этом релизе layout-ы кейсов авторятся и поддерживаются в конструкторе — конструктор является источником истины. Установка или обновление content-пака не создаёт и не перезаписывает ваши строки layout-ов кейсов, так что ваши правки layout-ов никогда не откатываются молча обновлением пака. (Layout-ы, которые вы хотите распространять, путешествуют как экспортированные пакеты
.layout.json.) Поскольку пак никогда не несёт layout-ы кейсов, карточка пака в Marketplace больше не показывает счётчик «layouts».
Распространённые ошибки
- «Save серая». Layout attached, virtual, персональный-но-не-ваш, или у вас
нет
layouts.manage. Duplicate или Detach, чтобы получить редактируемую копию; сохранение virtual-дефолта его материализует. - Путаница персональный vs управляемый. Персональный layout меняет только ваш экран. Если изменение должно дойти до всей команды, редактируйте управляемый дефолт (вкладка Defaults → Edit), а не персональную копию.
- Префикс
incident.не место в пути поля layout-а. Field Data Path поля layout-а — голое machine-имя (acme_ticket_id). Формаincident.*— для плейбуков/Context Data, а не для layout-а детали кейса — см. Главу 6 §6.4. - Display Filter в UI делает только equals. Для in, not-in, truthy,
falsy, exists или not-equals редактируйте
visibleWhenв Settings → Advanced JSON. - List View — не пикер колонок. Она настраивает inline-чипы значений, а не колонки таблицы кейсов — см. §7.7.
- Только представление Summary имеет вкладки. Формы Edit, Close и Quick View — плоские списки секций, не ищите там панель вкладок.
- Layout привязан к одному типу инцидента. Чтобы покрыть несколько типов, дублируйте layout и перепривяжите каждую копию (или используйте широкий дефолт и персональные переопределения).
- Виджеты vs данные. Виджет отрисовывается, только когда существует его источник
данных — GRC-виджеты остаются пустыми без модуля
grc; email-виджетам нужен email-контекст на кейсе.