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 sourcesystem (встроенный дефолт) или custom (ваш). (marketplace — зарезервированный тег для контента, поставленного паком; о том, как паки и layout-ы соотносятся в этом релизе, см. §7.11.)

Как кейс выбирает свой layout (порядок резолвинга). Когда аналитик открывает кейс, платформа резолвит layout в этом порядке и останавливается на первом попадании: (1) layout, прикреплённый напрямую к этому конкретному кейсу; (2) персональный layout текущего пользователя для типа инцидента кейса; (3) управляемый дефолт типа инцидента; (4) встроенный виртуальный дефолт для этого типа. Виртуальный дефолт генерируется на лету (состояние attached, источник system) и это то, что вы видите, пока никто не сохранил кастомный дефолт.

7.2. Рабочее пространство layout-ов (список)

/admin/layouts открывает рабочее пространство: поле поиска, фильтр по типу инцидента, пилюли-счётчики и четыре вкладки. Действия справа сверху: Import Personal, а с layouts.manageImport 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 ButtonsNew 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 KindFields, Buttons или Widgets (что держит секция).
  • Section LayoutRows / Grid или Cards / Stack.
  • Columns1, 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 ActionCustom 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 OptionsDefault или Format for exporting (A4 export layout).
  • Show empty fields для всей вкладки.

У выдвижной панели каждого элемента также есть Duplicate и Delete в заголовке.

7.7. List View / inline-поля значений

Вкладка List View рабочего пространства (и та же панель под Objects Setup → More settingsInline values) — это не редактор колонок таблицы кейсов. Она настраивает inline-поля значений — маленькие, редактируемые на месте чипы значений, показываемые в очереди кейсов и сводках.

  • Левая панель — список полей инцидента с переключателем на каждое поле (включить его как inline-значение). Поля-вложения исключены.
  • Выберите поле, чтобы настроить его справа: Display order (число) и Display styleText или 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-контекст на кейсе.