Перейти к основному содержимому

Конфигурация

Настройте таблицу Pivot и панель конфигурации с помощью следующего API:

  • config — определяет структуру таблицы Pivot и способ агрегации данных
  • render-table — изменяет конфигурацию таблицы на лету
  • tableShape — настраивает внешний вид таблицы Pivot
  • columnShape — настраивает внешний вид и поведение столбцов
  • headerShape — настраивает внешний вид и поведение заголовков
  • configPanel — управляет видимостью панели конфигурации
  • setLocale — применяет локаль (см. Локализация)
  • data, fields — загружают данные и метаданные полей
  • predicates — предварительно обрабатывают данные перед агрегацией
  • methods — определяют пользовательские методы агрегации
  • limits — ограничивают количество строк и столбцов в итоговом наборе данных

Инструкции по работе с данными см. в разделе Работа с данными.

Вы можете настроить следующие элементы таблицы Pivot:

  • столбцы и строки
  • заголовки и подвалы
  • ячейки
  • размеры таблицы

Изменение размеров таблицы

Используйте свойство tableShape, чтобы изменить размер строк, столбцов, заголовка и подвала.

Следующий фрагмент кода показывает размеры по умолчанию:

const sizes = {
rowHeight: 34,
headerHeight: 30,
footerHeight: 30,
columnWidth: 150
};

Следующий фрагмент кода переопределяет размеры по умолчанию:

const table = new pivot.Pivot("#root", {
fields,
data,
tableShape: {
sizes: {
rowHeight: 44,
headerHeight: 60,
footerHeight: 30,
columnWidth: 170
}
},
config: {
rows: ["studio", "genre"],
columns: [],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
}
});
информация

Чтобы задать ширину конкретных столбцов, используйте параметр width свойства columnShape.

Автоматическое изменение ширины столбцов по содержимому

Используйте параметр autoWidth свойства columnShape, чтобы вычислять ширину столбцов автоматически. Все подпараметры autoWidth являются необязательными — полные описания см. в справочнике columnShape.

Объект autoWidth принимает следующие параметры:

  • columns — объект, определяющий, для каких полей вычисляется ширина автоматически
  • auto — подстраивает ширину под заголовок, содержимое ячейки или под оба варианта
  • maxRows — количество строк данных, анализируемых для определения размера столбца (по умолчанию: 20)
  • firstOnly — если true (по умолчанию), каждое поле анализируется только один раз. Когда несколько столбцов основаны на одном поле (например, oil с count и oil с sum), анализируется только первый столбец, а остальные наследуют его ширину

Следующий фрагмент кода включает autoWidth для четырёх полей и отключает firstOnly, чтобы каждый столбец получил собственное измерение:

const table = new pivot.Pivot("#root", {
fields,
data,
config: {
rows: ["studio", "genre"],
columns: [],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
},
columnShape: {
autoWidth: {
// вычислять ширину столбца для этих полей
columns: {
studio: true,
genre: true,
title: true,
score: true
},
// анализировать все поля
firstOnly: false
}
}
});

Применение шаблонов к ячейкам

Добавление шаблонов через tableShape

Используйте параметр templates свойства tableShape, чтобы отображать значения ячеек через функцию. Каждый ключ — это идентификатор поля, а каждое значение — функция, возвращающая строку. Все столбцы, основанные на указанном поле, получают этот шаблон.

В примере ниже к ячейкам state применяется шаблон, который отображает объединённое название штата (полное название и аббревиатура):

const states = {
"California": "CA",
"Colorado": "CO",
"Connecticut": "CT",
"Florida": "FL",
// другие значения
};

const table = new pivot.Pivot("#root", {
tableShape: {
templates: {
// настроить значения ячеек "state"
state: v => v + ` (${states[v]})`,
}
},
fields,
data,
config: {
rows: ["state", "product_type"],
columns: [],
values: [
{
field: "profit",
method: "sum"
},
{
field: "sales",
method: "sum"
},
// другие значения
],
},
fields,
});

Добавление шаблона через хелпер template

Чтобы вставить HTML-содержимое в ячейки тела таблицы, используйте хелпер pivot.template и присвойте результат свойству cell объекта столбца. Применяйте шаблон непосредственно перед отрисовкой таблицы, перехватывая событие render-table с помощью метода api.intercept.

В примере ниже в ячейки тела добавляются иконки (звезда или флаг) в зависимости от поля (id, user_score):

function cellTemplate(value, method, row, column) {
const field = column.fields ? column.fields[row.$level] : column.field;

if (field === "id") {
return idTemplate(value);
}

if (field === "user_score") {
return scoreTemplate(value);
}

return value;
}

function idTemplate(value) {
const name = value?.toString().split("-")[0];
return `<span className="cell-id flag-${name}"></span> ${value}`;
}

function scoreTemplate(value) {
return `<i className="cell-score wxi-star"></i> ${value}`;
}

widget.api.intercept("render-table", ({ config: tableConfig }) => {
tableConfig.columns = tableConfig.columns.map((c) => {
if (c.area === "rows") {
// применить шаблон к ячейкам столбца из области "rows"
c.cell = pivot.template(({ value, method, row, column }) => cellTemplate(value, method, row, column));
}
return c;
});
});

Применение шаблонов к заголовкам

Добавление шаблонов через headerShape

Чтобы управлять форматом текста в заголовках, используйте параметр template свойства headerShape. Параметр представляет собой функцию, которая:

  • принимает метку поля, его ID и подпись (название метода, если есть)
  • возвращает обработанное значение

Шаблон по умолчанию:

template: (label, id, subLabel) =>
label + (subLabel ? ` (${subLabel})` : "")

Без пользовательского шаблона поля области values отображают метку и метод (например, Oil(count)), а поля других областей отображают значение label. Шаблон predicates переопределяет шаблон headerShape.

В примере ниже текст заголовка преобразуется в нижний регистр, давая такие метки, как profit (sum):

new pivot.Pivot("#pivot", {
data,
headerShape: {
// пользовательский шаблон для текста заголовка
template: (label, id, subLabel) => (label + (subLabel ? ` (${subLabel})` : "")).toLowerCase(),
},
config: {
rows: ["state", "product_type"],
columns: [],
values: [
{
field: "profit",
method: "sum"
},
{
field: "sales",
method: "sum"
},
// другие значения
],
},
fields,
});

Добавление шаблонов через хелпер template

Чтобы вставить HTML-содержимое в ячейки заголовков, используйте хелпер pivot.template и присвойте результат свойству cell объекта ячейки заголовка. Применяйте шаблон непосредственно перед отрисовкой таблицы, перехватывая событие render-table с помощью метода api.intercept.

В примере ниже иконки добавляются к:

  • меткам заголовков на основе имени поля (например, id получает иконку глобуса)
  • заголовкам столбцов на основе значения ячейки (цветные стрелки-индикаторы в зависимости от значения status)
function rowsHeaderTemplate(value, field) {
let icon = "";
if (field === "id") icon = "<i className='icon wxi-earth'></i>";
if (field === "user_score") icon = "<i className='icon wxi-star'></i>";
return `${value} ${icon}`;
}

function statusTemplate(value) {
let icon = "";
if (value === "Up") icon = "<i style='color:green' className='icon wxi-arrow-up'></i>";
if (value === "Down") icon = "<i style='color:red' className='icon wxi-arrow-down'></i>";
return `${value} ${icon}`;
}

widget.api.intercept("render-table", ({ config: tableConfig }) => {
tableConfig.columns = tableConfig.columns.map((c) => {
if (c.area === "rows") {
// применить шаблон к первой строке заголовка столбцов из области "rows"
c.header[0].cell = pivot.template(({ value, field }) => rowsHeaderTemplate(value, field));
} else {
// ячейки заголовка, отображающие значения из поля "status"
const headerCell = c.header.find((h) => h.field === "status");
if (headerCell) {
headerCell.cell = pivot.template(({ value }) => statusTemplate(value));
}
}
return c;
});
});

Сворачиваемые столбцы

Чтобы пользователи могли сворачивать и разворачивать столбцы под общим заголовком, установите параметр collapsible свойства headerShape в true.

Следующий фрагмент кода включает сворачиваемые заголовки столбцов:

const table = new pivot.Pivot("#root", {
fields,
data,
headerShape: {
collapsible: true,
},
config: {
rows: ["studio", "genre"],
columns: [],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
}
});

Фиксация столбцов

Зафиксируйте столбцы слева или справа, чтобы они оставались видимыми при прокрутке остальной части таблицы. Используйте параметр split свойства tableShape и установите left или right в true.

Фиксация столбцов слева

Когда split.left равно true, количество зафиксированных столбцов соответствует количеству полей rows в свойстве config. В древовидном режиме фиксируется только один столбец независимо от количества полей rows.

Следующий фрагмент кода фиксирует один столбец слева (определено одно поле rows):

const table = new pivot.Pivot("#root", {
fields,
data,
config: {
rows: ["studio"],
columns: ["genre"],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
},
tableShape: {
split: {left: true }
}
});

Чтобы задать пользовательское количество фиксированных столбцов, подпишитесь на событие render-table и переопределите tableConfig.split. Избегайте разделения столбцов с объединёнными ячейками (colspan).

Следующий фрагмент кода фиксирует слева все столбцы rows плюс удвоенное количество полей values:

const table = new pivot.Pivot("#root", {
fields,
data,
config: {
rows: ["continent", "name"],
columns: ["year"],
values: [
{
field: "oil",
method: "sum"
},
{
field: "oil",
method: "count"
}
]
}
});
table.api.on("render-table", ({ config: tableConfig }) => {
const { config } = table.api.getState();

tableConfig.split = {
left: config.rows.length + config.values.length * 2
};
});

Фиксация столбцов справа

Установите split.right в true, чтобы зафиксировать итоговые столбцы справа.

Следующий фрагмент кода фиксирует итоговый столбец справа:

const widget = new pivot.Pivot("#pivot", {
fields,
data: dataset,
tableShape:{
split: {right: true},
totalColumn: true,
},
config: {
rows: ["hobbies"],
columns: ["relationship_status"],
values: [
{
field: "age",
method: "min"
},
{
field: "age",
method: "max"
}
]
}
});

Чтобы зафиксировать произвольное количество столбцов справа, подпишитесь на событие render-table и переопределите tableConfig.split. Избегайте разделения столбцов с объединёнными ячейками (colspan).

Следующий фрагмент кода фиксирует справа столько столбцов, сколько полей в values:

const widget = new pivot.Pivot("#pivot", {
fields,
data: dataset,
config: {
rows: ["hobbies"],
columns: ["relationship_status"],
values: [
{
field: "age",
method: "min"
},
{
field: "age",
method: "max"
}
]
}
});

widget.api.on("render-table", ({ config: tableConfig }) => {
const { config } = widget.api.getState();
tableConfig.split = {
right: config.values.length,
}
})

Сортировка в столбцах

Сортировка в интерфейсе включена по умолчанию — пользователи нажимают на заголовок столбца для сортировки. Чтобы отключить её, установите параметр sort свойства columnShape в false.

Следующий фрагмент кода отключает сортировку в интерфейсе:

const table = new pivot.Pivot("#root", {
fields,
data,
config: {
rows: ["studio", "genre"],
columns: [],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
},
columnShape: {
sort: false
}
});

Подробнее о сортировке по умолчанию, пользовательских компараторах и обновлениях во время выполнения см. в разделе Сортировка данных.

Включение древовидного режима

Древовидный режим отображает данные иерархически с раскрываемыми строками. Установите параметр tree свойства tableShape в true (по умолчанию false). Первое поле массива rows в config становится родительской строкой.

Следующий фрагмент кода включает древовидный режим с studio в качестве родителя и genre в качестве вложенных строк:

const table = new pivot.Pivot("#root", {
tableShape: {
tree: true
},
fields,
data: dataset,
config: {
rows: ["studio", "genre"],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
},
{
field: "episodes",
method: "count"
},
{
field: "rank",
method: "min"
},
{
field: "members",
method: "max"
}
]
}
});

Развёртывание и свёртывание всех строк

Чтобы программно развернуть или свернуть все строки, включите древовидный режим через свойство tableShape. Затем получите экземпляр виджета Table с помощью метода getTable и вызовите событие open-row или close-row через метод api.exec таблицы.

В примере ниже отрисовываются кнопки «Открыть все» и «Закрыть все», которые разворачивают или сворачивают все ветки в древовидном режиме:

const table = new pivot.Pivot("#root", {
tableShape: {
tree: true
},
fields,
data: dataset,
config: {
rows: ["type", "studio"],
columns: [],
values: [
{
field: "score",
method: "max"
},
{
field: "rank",
method: "min"
},
{
field: "members",
method: "sum"
},
{
field: "episodes",
method: "count"
}
]
}
});

const api = table.api;
const tableInstance = api.getTable();
// держать все ветки таблицы закрытыми при отрисовке
api.intercept("render-table", (ev) => {
ev.config.data.forEach((r) => (r.open = false));

// вернуть false здесь, чтобы предотвратить отрисовку таблицы
// return false;
});

function openAll() {
tableInstance.exec("open-row", { id: 0, nested: true });
}

function closeAll() {
tableInstance.exec("close-row", { id: 0, nested: true });
}

const openAllButton = document.createElement("button");
openAllButton.addEventListener("click", openAll);
openAllButton.textContent = "Open all";

const closeAllButton = document.createElement("button");
closeAllButton.addEventListener("click", closeAll);
closeAllButton.textContent = "Close all";

document.body.appendChild(openAllButton);
document.body.appendChild(closeAllButton);

Изменение ориентации текста заголовков

Чтобы повернуть текст заголовков из горизонтального в вертикальное положение, установите параметр vertical свойства headerShape в true.

Следующий фрагмент кода отрисовывает вертикальный текст заголовков:

const table = new pivot.Pivot("#root", {
fields,
data,
headerShape: {
vertical: true
},
config: {
rows: ["studio"],
columns: ["type"],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
}
});

Управление видимостью панели конфигурации

Панель конфигурации отображается по умолчанию. Пользователи могут переключать её с помощью кнопки Скрыть настройки / Показать настройки. Управляйте панелью программно через свойство configPanel, событие show-config-panel или метод showConfigPanel.

Скрыть панель конфигурации

Чтобы скрыть панель при инициализации, установите свойство configPanel в false.

Следующий фрагмент кода инициализирует Pivot со скрытой панелью:

// панель конфигурации скрыта при инициализации
const table = new pivot.Pivot("#root", {
fields,
data: dataset,
configPanel: false,
config: {
rows: ["hobbies"],
columns: ["relationship_status"],
values: [
{
field: "age",
method: "min"
},
{
field: "age",
method: "max"
}
]
}
});

Чтобы переключить панель во время выполнения, вызовите событие show-config-panel с помощью метода api.exec и установите параметр mode в false.

Следующий фрагмент кода скрывает панель после инициализации:

const table = new pivot.Pivot("#root", {
fields,
data,
config: {
rows: ["studio", "genre"],
columns: [],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
}
});
// скрыть панель конфигурации
table.api.exec("show-config-panel", {
mode: false
});

Отключение переключения по умолчанию

Чтобы полностью заблокировать стандартную кнопку переключения, перехватите событие show-config-panel с помощью метода api.intercept и верните false.

Следующий фрагмент кода отключает кнопку переключения:

const table = new pivot.Pivot("#root", {
fields,
data,
config: {
rows: ["studio", "genre"],
columns: [],
values: [
{
field: "title",
method: "count"
},
{
field: "score",
method: "max"
}
]
}
});

table.api.intercept("show-config-panel", () => {
return false;
});

В качестве альтернативного API используйте метод showConfigPanel.

Действия с полями на панели

Панель конфигурации поддерживает следующие операции с полями:

  • add-field — добавить поле в область
  • delete-field — удалить поле из области
  • update-field — обновить метод или настройки поля
  • move-field — изменить порядок полей внутри области

Связанные примеры: