Skip to content

Панель Table ​

English · Русский

English version

Назначение ​

Панель table показывает данные в таблице. Пользователь может выбирать строки, сортировать и фильтровать данные, переходить между страницами и выполнять настроенные действия. В конфигурации задаются источник данных, запрашиваемые атрибуты, колонки и реакция панели на события. Панель показывает, когда данные загружаются или запрос не вернул ни одной строки.

Используйте Table для списка объектов, связанных дочерних объектов, результата метода или простой HTTP-коллекции, когда нужен готовый табличный интерфейс.

Когда использовать ​

Table подходит для просмотра, сравнения, сортировки, фильтрации, выбора и действий над строками. Для раскрытия иерархии используйте Tree, для атрибутов одного выбранного объекта — Attributes.

Сначала выберите способ запроса, затем настраивайте колонки.

ЗадачаПризнаки запросаОбработка
Объекты одного метатипаmetaTypeNameСервер
Объекты через Link от выбранного родителяgetSelectedObjectForEventId + linkName без metaTypeNameСервер
Объекты с атрибутом-ссылкой на родителяСобытие + metaTypeName + linkedAttributeСервер
Строки из метаметодаmethodNameМетод и его исполнитель
JSON-коллекция вне API объектов MEScustomRequestПолный массив с сервера, затем сортировка и страницы в клиенте

Настройте один способ получения данных. Если указать параметры нескольких способов, панель выберет первый подходящий в таком порядке: customRequest, methodName, запрос через атрибут-ссылку на родителя, запрос через Link, обычный запрос по метатипу. При ошибке запроса панель не переключится на следующий способ.

Предпосылки и ответственность ​

Каждой Table нужны уникальный id, type: "table", request и columns. Для обычных запросов, связей и методов используйте фактические имена типов, Link, атрибутов и методов сервера. Для запроса по выбранному родителю пользователь сначала выбирает объект в панели-источнике, а её событие сохраняет выбор через addSelectedObjectToRequest.

Общий механизм запросов панели отправляет запрос и преобразует ответ. Метаданные атрибутов определяют типы обычных значений MES. columns[].dataType прежде всего задаёт тип для произвольных HTTP-строк, где метаданных MES нет.

Ответ запроса через Link содержит Link и связанный Object. Для атрибутов Link в колонках и списке ответа используйте link.<attribute>.

Возможности ​

Запросы и состав ответа ​

Обычный запрос по метатипу ​

json
{
  "id": "orders",
  "type": "table",
  "request": {
    "metaTypeName": "ProductionOrder"
  },
  "columns": [
    {
      "attribute": "itemId",
      "label": "Заказ"
    }
  ]
}

При выборе заказа панель-источник должна выполнить addSelectedObjectToRequest в событии order-selected.

json
{
  "id": "order-operations",
  "type": "table",
  "request": {
    "getSelectedObjectForEventId": "order-selected",
    "linkName": "OrderOperation",
    "reverse": false
  },
  "columns": [
    {
      "attribute": "name",
      "label": "Операция"
    },
    {
      "attribute": "link.sequence",
      "label": "Позиция",
      "dataType": "Integer"
    }
  ]
}

Запрос через атрибут ​

Приложение ищет объекты нужного метатипа и добавляет условие равенства linkedAttribute GUID выбранного родителя. Сначала выберите родителя в панели-источнике: без этого выбора Table не отправляет POST /Object/find для такого запроса. Смена родителя или снятие его выбора сразу очищает прежние дочерние строки, их выбор и событие выбора, которое используют действия и зависимые панели. Перед действием, которому нужна выбранная дочерняя строка, выберите строку нового родителя. Table начинает первую страницу нового родителя, сохраняя размер страницы, сортировку и применённые фильтры. Ранее отправленный запрос не может вернуть строки прежнего родителя после этой смены.

json
{
  "id": "order-materials",
  "type": "table",
  "request": {
    "metaTypeName": "MaterialRequirement",
    "getSelectedObjectForEventId": "order-selected",
    "linkedAttribute": "productionOrder"
  },
  "columns": [
    {
      "attribute": "material.name",
      "label": "Материал"
    }
  ]
}

Запрос через метод ​

Общий механизм поддерживает этот способ, хотя локальный тип TableRequest пока не перечисляет его. Исполнитель определяет GUID для objects[] тем же способом, что и действие runMethod, и отправляет parent, methodName и GUID в POST /MetaMethods/Run. Ответ он обрабатывает как коллекцию объектов. Фильтры, сортировку и параметры страниц Table исполнитель в метод не передаёт.

json
{
  "id": "local-shared-config-method-request",
  "type": "table",
  "request": {
    "methodName": "FindLocalOrdersForAnchor",
    "parent": "LocalOrder",
    "objects": [
      {
        "objectId": {
          "objectGuid": "local-order-001"
        }
      }
    ]
  },
  "columns": [
    {
      "attribute": "code",
      "label": "Код"
    },
    {
      "attribute": "product",
      "label": "Изделие"
    },
    {
      "attribute": "status",
      "label": "Статус"
    },
    {
      "attribute": "priority",
      "label": "Приоритет"
    }
  ]
}

В этом локальном примере фиксированный objectId даёт local-order-001. Демонстрационный обработчик требует соответствующие parent, метод и объект и возвращает три локальных заказа в формате ObjectsResponse. Пример не подтверждает наличие метода с таким именем на рабочем сервере.

Произвольный HTTP-запрос ​

customRequest.method обязателен; поддерживаются GET, POST, PUT, PATCH, DELETE. Table передаёт только URL и метод, без заголовков и тела. dataPath задаёт путь через точки к массиву, не JSONPath. idField по умолчанию равен id.

json
{
  "id": "service-health",
  "type": "table",
  "request": {
    "customRequest": {
      "method": "GET",
      "url": "/monitoring/services",
      "idField": "serviceId",
      "dataPath": "data.items"
    }
  },
  "pagination": {
    "rowsPerPage": [10, 25]
  },
  "columns": [
    {
      "attribute": "serviceId",
      "label": "ID",
      "dataType": "String",
      "fixedWidth": "10rem"
    },
    {
      "attribute": "name",
      "label": "Сервис",
      "dataType": "String",
      "sortable": true
    },
    {
      "attribute": "healthy",
      "label": "Работает",
      "dataType": "Boolean",
      "sortable": true
    }
  ]
}

Table преобразует строки в представление объектов. Без dataType она распознаёт только строку, целое число, дробное число и логическое значение; null, массивы, объекты и остальные значения получают dtUndefine. Явный тип колонки имеет приоритет.

Для обычного запроса и запроса через Link список атрибутов ответа берётся из request.attributeList, если он задан, иначе — из columns[].attribute. Явный список полностью заменяет список колонок. Включите в него скрытые атрибуты, необходимые действиям. Запрос объектов исключает link.*, а запрос через Link преобразует link.attribute в link:attribute для API.

Типы колонок и отображение значений ​

Каждая колонка связывает attribute с локализованной подписью label.

  • sortable включает управление сортировкой в заголовке, кроме запросов через метод. Для таких запросов Table сохраняет порядок, который вернул метод, и не показывает управление сортировкой.
  • dataType задаёт тип там, где нет метаданных, в частности для HTTP-строк.
  • maxRows ограничивает многострочное отображение.
  • maxHeight ограничивает высоту содержимого ячейки и допускает прокрутку внутри.
  • Даты, объекты, логические значения, JSON и цвета отображают общие компоненты; Table не определяет для них отдельные правила.

Состояние запроса, фильтры, сортировка и страницы ​

Table хранит pagination и sortParams в своём состоянии и передаёт их в реестр ответов панелей. Применённые findAttributes находятся в реестре. Перед первым запросом объектов Table копирует туда request.findAttributes, только если у панели ещё нет состояния фильтров. Первый запрос сразу использует эти значения; открывать окно фильтров и нажимать Apply не нужно. Конфигурация остаётся неизменной.

Каждое настроенное условие задаётся полями field, compareType и value, например { "field": "isTemplate", "compareType": "EQUAL", "value": "true" }. Значения — строки или null. Полный пример начального фильтра показывает конфигурацию, тело API-запроса и правила полей Link.

filter.fields задаёт поля, которые пользователь может редактировать в окне фильтров. Окно копирует текущие условия из реестра в черновик. Apply заменяет применённые условия в реестре, сохраняет размер страницы, сбрасывает offset в 0 и запускает запрос. Reset очищает только черновик и не отправляет запрос. Нажмите Apply после Reset, чтобы записать [] в реестр и запросить строки без редактируемых фильтров. Cancel или закрытие окна до Apply отменяет черновик и сохраняет применённые фильтры.

Смена страницы, сортировка, повторный запрос и повторное монтирование используют применённое состояние, включая [] после Reset и Apply, и не возвращают начальные значения. Для EMPTY и NOT_EMPTY передавайте null: значение сравнения не требуется. При этих операторах выбор сравнения остаётся доступен: можно выбрать другое условие без сброса поля. Имя элемента для программы чтения с экрана указывает, для какого поля меняется сравнение.

При повторном открытии Table без смены родителя приложение восстанавливает текущую страницу и сортировку. Если родитель изменился, пока Table была закрыта, открытие таблицы или действие Reload Entities начинает первую страницу нового родителя и снимает выбор прежней дочерней строки. Оба способа сохраняют применённые фильтры, включая [] после Reset и Apply. Индикатор в заголовке показывает первое восстановленное правило сортировки, если оно соответствует колонке с разрешённой сортировкой.

Это редактируемые значения по умолчанию. При запросе через linkedAttribute приложение отдельно добавляет обязательное условие по выбранному родителю; Reset с последующим Apply не удаляет его. request.filter объявлен, но не действует. request.sortParams задаёт начальную серверную сортировку, пока её не переопределили в интерфейсе.

Обычный запрос, запрос через Link и запрос через атрибут отправляют сортировку и параметры страниц серверу. Исполнитель метода игнорирует фильтры, сортировку и страницы, даже если общий объект запроса их содержит: метод должен вернуть пригодную коллекцию. Произвольный HTTP-источник получает полный массив, затем сортирует и выделяет страницу в памяти клиента. Сортировка всегда сбрасывает смещение в 0.

pagination.rowsPerPage задаёт варианты размера страницы; первое число определяет размер в начальном запросе, если приложение не восстановило состояние страниц. Без настройки и восстановленного состояния первый запрос объектов не содержит pagination. Интерфейс использует варианты [3, 5, 10, 15] и резервное значение 3, но при наличии параметров страниц в ответе API показывает их. Эти значения интерфейса не ограничивают запрос на сервере. Укажите rowsPerPage явно, если первому запросу нужен определённый размер страницы.

Перед сменой страницы, сортировки, фильтра, выбранного родителя или приложения приложение проверяет затронутые редакторы объектов. Если есть несохранённые правки, оно предлагает остаться или отбросить их. Выбор «остаться» или закрытие предупреждения сохраняет текущий контекст и черновик; сохраните или отмените правки в редакторе перед повторной попыткой. Отказ от правок очищает затронутые черновики и разрешает переход. Пока редактор загружает или сохраняет данные, приложение блокирует переход и предлагает подождать; повторите действие после завершения операции. Защита работает и без SignalR. Фоновое событие SignalR не предлагает отбросить правки: редактор сохраняет черновик и откладывает обновление затронутых данных до завершения редактирования.

Выбор и события ​

selectionMode принимает single или multiple, по умолчанию — single. Приложение хранит выбор по идентификатору панели. Событие onObjectSelect может передать последнюю выбранную строку через addSelectedObjectToRequest, записать переменные или выполнить другие поддерживаемые действия.

Снятие выбора очищает сохранённое событие. Зависимые запросы и условия objectSelected реагируют и на выбор, и на его снятие. При множественном выборе контекстом межпанельного события остаётся последний выбранный объект.

Действия панели и строки ​

filter или panelActions включает область действий в заголовке. panelActions использует общий исполнитель и принимает старый массив либо группы действий. Указывайте методы, которые поддерживает общий обработчик.

itemActions добавляет колонку действий строки. itemActionsMaxVisible ограничивает число действий до меню переполнения. В строке Table поддержаны:

  • update;
  • deleteObject;
  • deleteLink;
  • actions с событием onButtonClick;
  • openSchedule;
  • selectObject;
  • runMethod;
  • http.

Кнопка дополнительных действий имеет имя для программы чтения с экрана и сообщает, открыто ли меню её строки.

Другие действия общего типа не становятся автоматически доступными строке Table. Обработчик использует objectSelector преобразованной строки; идентификаторы произвольного HTTP-ответа должны соответствовать реальным объектам, если действие обращается к API объектов.

Состояния интерфейса и ширина ​

ui.title задаёт заголовок. Table показывает заголовок и пустую область строк ещё до первого ответа. Пока идёт запрос, DataTable показывает загрузку, а пустая область — общий текст загрузки. После успешного ответа приложение показывает строки из ответа или сообщение о пустом результате.

После успешного пустого ответа Table оставляет переход между страницами, если API сообщает положительное общее число записей: так можно уйти с пустой поздней страницы. При нулевом или отсутствующем числе записей переход скрыт. Table показывает ui.emptyMessage, если он задан, иначе — общий перевод пустого списка. При ошибке обычного поиска объектов, поиска через linkedAttribute или запроса через Link Table очищает прежние строки и снимает их выбор, чтобы действия больше не использовали ранее выбранные строки. Пустая область показывает сообщение «Не удалось загрузить таблицу» и кнопку «Повторить»; заголовок и управление фильтрами остаются доступны. Нажмите «Повторить», чтобы отправить запрос с текущими применёнными фильтрами, параметрами страниц и выбранным родителем. Во время повторного запроса приложение показывает загрузку вместо ошибки; после успеха — строки из ответа или сообщение о пустом результате. Если старый запрос завершится ошибкой после начала нового, эта ошибка не заменит результат нового запроса.

Сообщение об ошибке встроено в Table и не имеет отдельного параметра конфигурации. Запросы через метод, запрос одного объекта и произвольный HTTP-запрос не используют это поведение с ошибкой и повторной попыткой.

ПараметрПоведение
fixedWidthФиксированная CSS-ширина; заголовок и содержимое обрезаются многоточием. Наличие действующей фиксированной колонки включает фиксированную раскладку таблицы.
minWidthМинимальная полезная ширина; таблица может стать шире панели, тогда контейнер прокручивается по горизонтали.
widthСтарое указание ширины при автоматической раскладке; содержимое, отступы и сортировка могут его превысить.

Если у колонки указаны fixedWidth и minWidth, действует minWidth, а приложение записывает ошибку конфигурации. Минимальная ширина таблицы — сумма действующих ограничений и колонки действий, когда она нужна, но не меньше ширины панели. При фиксированных ширинах оставьте хотя бы одну описательную колонку гибкой.

Последовательность и взаимодействия ​

  1. Приложение выбирает способ запроса.
  2. Table инициализирует фильтры из конфигурации только при отсутствии их состояния в реестре, затем читает текущие фильтры, сортировку и страницы.
  3. Формирует список ответа из attributeList или колонок.
  4. Отправляет запрос, преобразует строки и записывает ответ и параметры в реестр.
  5. Форматирует строки через типизированные записи attributesMap.
  6. Показывает колонки, выбор и доступные действия.
  7. При изменении страницы, сортировки или фильтров меняет состояние запроса и запрашивает строки повторно; HTTP-источник обрабатывает исходный массив в клиенте.
  8. При смене родителя или снятии его выбора очищает прежние строки и их выбор, сбрасывает смещение и использует GUID нового родителя в идентичности запроса. Без родителя ждёт выбора перед запросом дочерних объектов.

Фильтры, сортировка и страницы входят в состояние запроса: одно изменение может сбросить смещение или изменить идентичность запроса. Действие не может прочитать атрибут, которого нет в ответе, поэтому список ответа должен соответствовать действиям.

Значения по умолчанию и приоритеты ​

  • Способ запроса: HTTP > метод > через атрибут > через Link > обычный.
  • Список ответа: явный attributeList > атрибуты колонок.
  • Тип HTTP-значения: dataType колонки > распознавание по значению.
  • Режим выбора: настройка > single.
  • Размер в начальном запросе: восстановленное состояние страниц > первое число rowsPerPage; без обоих запрос объектов не содержит параметров страниц.
  • Число видимых действий строки: itemActionsMaxVisible > 2.
  • Ширина: minWidth > fixedWidth > старый width > гибкая.
  • Пустой ответ: локализованный ui.emptyMessage > общий перевод.

Колонки и действия сохраняют порядок массива. Сортировка одной колонки создаёт одно текущее правило сортировки.

Ограничения и расхождения ​

  • Общий механизм исполняет запросы через методы, но локальный TableRequest не перечисляет их.
  • Исполнитель метода не передаёт фильтры, сортировку или страницы Table.
  • request.filter не действует; начальные фильтры объектов задавайте через request.findAttributes.
  • Начальные фильтры можно изменить; они не задают постоянных ограничений.
  • HTTP-источник не отправляет тело и заголовки и требует полный массив для обработки в клиенте.
  • Для строк HTTP-сортировка использует браузерный localeCompare, для чисел — вычитание, иначе сравнивает строковые представления. Она не воспроизводит специальные серверные или предметные правила порядка.
  • Встроенное сообщение об ошибке с повторной попыткой действует для обычного поиска, поиска через атрибут и запроса через Link. Оно не настраивается и не охватывает запросы через метод, запрос одного объекта и произвольный HTTP-запрос. Отдельного состояния-заглушки до первого ответа нет.
  • width не гарантирует фактическую ширину.
  • Фиксированная ширина обрезает и вложенное содержимое.
  • Действия строки поддерживают только перечисленную часть общих действий.

Минимальная конфигурация ​

json
{
  "id": "materials",
  "type": "table",
  "request": {
    "metaTypeName": "MaterialDefinition"
  },
  "columns": [
    {
      "attribute": "name",
      "label": "Материал"
    }
  ]
}

Полные сценарии ​

Главная таблица: выбор, фильтры, сортировка, страницы и действия ​

Сервер должен предоставлять ProductionOrder, указанные атрибуты, редактирование и удаление. При выборе строки её событие сохраняет production-order-selected для зависимой панели.

json
{
  "id": "production-orders",
  "type": "table",
  "ui": {
    "title": {
      "ru": "Производственные заказы",
      "en": "Production orders"
    },
    "emptyMessage": {
      "ru": "Заказы не найдены",
      "en": "No orders found"
    }
  },
  "request": {
    "metaTypeName": "ProductionOrder",
    "attributeList": [
      "itemId",
      "name",
      "status",
      "plannedStart"
    ],
    "sortParams": [
      {
        "attribute": "plannedStart",
        "sortDirection": "ASC"
      }
    ]
  },
  "filter": {
    "fields": [
      {
        "attribute": "itemId",
        "label": "Номер"
      },
      {
        "attribute": "status",
        "label": "Статус"
      }
    ]
  },
  "pagination": {
    "rowsPerPage": [10, 25, 50]
  },
  "selectionMode": "single",
  "events": [
    {
      "id": "production-order-selected",
      "name": "onObjectSelect",
      "actions": [
        {
          "name": "addSelectedObjectToRequest"
        }
      ]
    }
  ],
  "columns": [
    {
      "attribute": "itemId",
      "label": "Номер",
      "sortable": true,
      "fixedWidth": "9rem"
    },
    {
      "attribute": "name",
      "label": "Наименование",
      "sortable": true,
      "minWidth": "18rem"
    },
    {
      "attribute": "status",
      "label": "Статус",
      "sortable": true,
      "fixedWidth": "10rem"
    },
    {
      "attribute": "plannedStart",
      "label": "Начало",
      "sortable": true,
      "fixedWidth": "12rem"
    }
  ],
  "itemActionsMaxVisible": 1,
  "itemActions": [
    {
      "id": "edit-order",
      "method": "update",
      "label": "Редактировать",
      "icon": "pencil",
      "editor": {
        "mode": "modal",
        "fields": [
          {
            "attribute": "name",
            "label": "Наименование"
          },
          {
            "attribute": "plannedStart",
            "type": "DateTime",
            "label": "Начало"
          }
        ]
      }
    },
    {
      "id": "delete-order",
      "method": "deleteObject",
      "label": "Удалить",
      "icon": "trash"
    }
  ]
}

Разместите её рядом с главной таблицей выше. Сначала выберите заказ: главная таблица сохранит событие production-order-selected, после чего зависимая Table отправит запрос связанных объектов с сортировкой и страницей.

json
{
  "id": "production-order-operations",
  "type": "table",
  "request": {
    "getSelectedObjectForEventId": "production-order-selected",
    "linkName": "OrderOperation",
    "reverse": false
  },
  "pagination": {
    "rowsPerPage": [10, 25]
  },
  "columns": [
    {
      "attribute": "link.sequence",
      "label": "№",
      "sortable": true,
      "fixedWidth": "5rem"
    },
    {
      "attribute": "name",
      "label": "Операция",
      "sortable": true,
      "minWidth": "20rem"
    },
    {
      "attribute": "durationMinutes",
      "label": "Минуты",
      "dataType": "Integer",
      "sortable": true,
      "fixedWidth": "8rem"
    }
  ]
}

Пример HTTP-источника в разделе возможностей показывает отдельный полный сценарий. В нём нет изменений строк: произвольные HTTP-идентификаторы сами по себе не устанавливают правила изменения объектов MES.

Демонстрации ​

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

На вкладке Method request общий механизм определяет фиксированный объект и вызывает локальный обработчик POST /MetaMethods/Run. Три возвращённых локальных заказа становятся строками Table. Уведомление об успехе показывает общий механизм runMethod.

На вкладке Custom request Table запрашивает JSON другого локального приложения, извлекает panel.panels по dataPath, использует type как idField и отображает колонки типов String и JSON. Отсортируйте ID или тип и переключите размер страницы между 1 и 2: клиент обрабатывает уже полученный полный массив.

Начальные фильтры и восстановление ​

Открыть «Фильтры таблицы и восстановление»

После установки зависимостей проекта выполните из корня репозитория:

bash
NUXT_PUBLIC_API_PREFIX=/local-api NUXT_LOCAL_FIXTURE_API_ENABLED=true pnpm -C apps/panel dev

Войдите с любыми непустыми учётными данными и выберите «Фильтры таблицы и восстановление» в списке приложений. Ссылка на демонстрацию выше открывает русский интерфейс. Чтобы открыть английские подписи и справку, замените путь в адресной строке браузера на /en/app/local-table-request-lifecycle-demo, сохранив адрес сервера панели.

Те же шаги описаны в справке приложения. Все идентификаторы ниже принадлежат этому набору данных. Объекты и имитацию ответов предоставляет локальный API; демонстрация не устанавливает, что внешний API возвращает для isTemplate или вложенных атрибутов.

  1. На вкладке «Начальный фильтр» Table запрашивает объекты с начальным фильтром { "field": "isTemplate", "compareType": "EQUAL", "value": "true" } ещё до открытия окна фильтра. Таблица показывает TEMPLATE-001 и TEMPLATE-002, счётчик фильтра — 1. Откройте фильтр, нажмите «Сбросить», затем «Применить»: появятся также OPERATION-001 и OPERATION-002. Сброс меняет только черновик; «Отменить» сохраняет применённый фильтр. Для повторения задайте isTemplate равно true и нажмите «Применить».
  2. На вкладке «Родитель и дочерние строки» выберите PARENT-A. В дочерней таблице задайте фильтр serialNumber «Содержит» KEEP и нажмите «Применить». При размере страницы 5 шесть строк KEEP-A-01–KEEP-A-06 займут две страницы. Строки OTHER-A и все строки родителя B не попадут в результат. Выберите PARENT-B: останутся только шесть строк KEEP-B. Сброс и применение удалят условие по номеру, сохранив ограничение выбранным родителем. Снимите выбор родителя: дочерняя таблица очистит строки и их выбор.
  3. В колонке единицы измерения дочерней таблицы отображается шт.. Локальный API возвращает это значение во вложенных атрибутах объектов materialDefinition → uom → designatorNational, а обычный механизм отображения Table читает его из ответа.
  4. Выберите PARENT-A, снова примените serialNumber «Содержит» KEEP, отсортируйте по колонке «Номер» и выберите дочернюю строку. На родительской панели нажмите «Ошибка при следующей загрузке» и дождитесь уведомления. Затем нажмите кнопку обновления дочерней таблицы. Локальный API один раз завершит этот запрос ошибкой; Table очистит прежние строки и их выбор и покажет «Повторить». Нажмите «Повторить»: строки вернутся с тем же родителем и применённым фильтром, а прежняя дочерняя строка останется невыбранной.
  5. Вернитесь на первую дочернюю страницу с размером 5 и тем же фильтром. Нажмите «Пустая следующая страница», дождитесь уведомления и перейдите на следующую страницу дочерней таблицы. Локальный API один раз вернёт пустой список строк, сохранив общее количество 6. Вернитесь на предыдущую страницу через переключатель страниц: строки появятся с прежним применённым фильтром и сортировкой.

«Сбросить имитацию» отменяет ещё не использованные имитации ответов, но не сбрасывает фильтры и страницы. Каждая имитация действует один раз; для повторения нажмите её кнопку снова. Ожидающие имитации относятся к этой сессии браузера, включая другие её вкладки, и действуют только на дочерние запросы этого приложения. Перед новой последовательностью сбросьте имитацию, выберите родителя и примените указанный выше фильтр.

Справочник параметров ​

Страницы параметров пока представлены на английском языке.

Связанные руководства и следующий шаг ​

Общие правила описаны в руководствах по запросам, фильтрам, сортировке и страницам, значениям и отображению, событиям и действиям. Затем настройте Attributes или Condition как потребителя выбора.

Живые обновления таблиц ​

Хаб уведомлений сейчас допускает анонимные подключения. Вход в панель не защищает доступ к хабу; перед включением владелец API должен подтвердить разграничение доступа. Панель отключает SignalR, если её API использует /local-api, даже при заданном URL хаба. Для проверки живых обновлений используйте реальный API.

После входа пользователя таблица читает текущую страницу через REST и подписывается на изменения найденных записей через SignalR. После события таблица повторяет REST-запрос и показывает новые значения, сохраняя фильтр, сортировку и выбранного родителя. Несохранённые правки остаются в редакторе; сохраните или отмените их, чтобы продолжить отложенное обновление.

Таблица остаётся подписанной, только пока держит принятый ответ текущего источника. Если запрос завершился ошибкой, таблица продолжает показывать прежние значения, но живых обновлений не получает до успешного обычного обновления; вернуть их помогает кнопка обновления таблицы.

Для включения ответственный за развёртывание получает у владельца API полный URL хаба, проверяет его доступность и разграничение доступа, затем задаёт NUXT_PUBLIC_REALTIME_HUB_URL в окружении процесса панели. Нужен абсолютный HTTP(S) URL с путём /hubs/notifications, без учётных данных, параметров запроса и фрагмента. После изменения переменной перезапустите процесс панели; для статической сборки задайте значение при сборке и заново опубликуйте результат. Пустое значение отключает SignalR. Менять JSON приложения не требуется.

Владелец API должен включить публикацию событий для нужных атрибутов через notifyEventType в метаданных типа. Переменная панели не включает события на сервере. После сохранения такого атрибута сервер отправляет событие, а таблица повторяет запрос.

Подписка на объект. JoinGroup(entityType, entityId) подписывает клиент на изменения конкретного известного объекта. Способ получения его типа и идентификатора не ограничивает саму подписку.

Обновление данных Table. Адаптер Table наблюдает записи текущей страницы и по их событиям повторяет её запрос. Стратегии Table method и custom пока не подключены к этому автоматическому перечитыванию.

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

Другие представления. Дерево, BPMN, Gantt и текстовые редакторы пока не подключены к автоматическому обновлению данных. Центр уведомлений не добавлен.