Webix Report Manager ожидает общий URL для загрузки и сохранения отчётов:
view:"reports", url:"remote/data"
Более подробную информацию о роутах и параметрах читайте в статье Работа с сервером.
Если у вас нет бэкенд сервера или ваш проект требует нестандартной логики, вы можете кастомизировать сервис Backend.
Report Manager ожидает JSON данные, где каждый элемент массива - объект со следующими полями:
Пример данных
id: 22
name: "Company per region"
text: "{
"desc":"Created on 10/28/2020",
"data":"companies",
"joins":[...],
"query":"",
"columns":[{"id":"companies.region_id","name":"Region",...],
"group":{"by":[{"id":"companies.region_id"}],"columns":[...]},
"buckets":
[{"column":"sales.product","options":[{"id":"Drinks",
"values":["black tea","espresso","latte","green tea"]},{"id":"Other"}]}],
"meta":{"freeze":1},"sort":null}",
updated: "2020-10-29T12:38:14Z"
У Report Manager есть следующие сервисы для работы с данными:
1. Local
const local = $$("reports").getService("local");
const modules = local.getModules(); // получаем отчёты
2. Charts
const charts = $$("reports").getService("charts");
charts.getTypes(); // получаем массив типов чартов
/*
[
{id: "line", value: "Line", icon: "mdi mdi-chart-line"},
{id: "spline", value: "Spline", icon: "mdi mdi-chart-bell-curve-cumulative"},
{id: "area", value: "Area", icon: "mdi mdi-chart-areaspline"},
// другие типы
]
*/
3. Helpers
const helpers = $$("reports").getService("helpers");
// проверяем, содержит ли поле какие-либо символы, кроме цифр
helpers.hasNonDigits(input);
4. Backend
const back = $$("reports").getService("backend");
back.getModels().then((data) => console.log(data));
Смотрите папку models исходного кода, чтобы познакомиться с сигнатурами методов.
Модуль - это конфигурация отчёта. Все модули хранятся в коллекции данных. Чтобы получить коллекцию, вызовите метод getModules() у сервиса Local.
const modules = $$("myReports").getService("local").getModules();
Чтобы убедиться в том, что коллекция уже загружена, используйте метод waitData, который возвращает промис:
Получаем первый модуль
const modules = $$("myReports").getService("local").getModules();
modules.waitData.then(function(){
modules.getItem(modules.getFirstId()); // получаем первый модуль
});
С помощью сериализации коллекции можно получить массив всех модулей:
Сериализация коллекции модулей
const modules = $$("myReports").getService("local").getModules();
modules.waitData.then(function(){
const arr = modules.serialize(); // получаем массив модулей
/*[
{
id: 22
name: "Company per region"
text: "{
"desc":"Created on 10/28/2020",
"data":"companies",
"joins":[...],
"query":"",
"columns":[{"id":"companies.region_id","name":"Region",...],
"group":{"by":[{"id":"companies.region_id"}],"columns":[...]},
"buckets":
[{"column":"sales.product","options":[{"id":"Drinks",
"values":["black tea","espresso","latte","green tea"]},{"id":"Other"}]}],
"meta":{"freeze":1},"sort":null}",
updated: "2020-10-29T12:38:14Z"
},
...
]*/
});
Модели - это источники данных. Все модели хранятся в коллекции данных. Чтобы получить коллекцию, вызовите метод getModels() у сервиса Local. Метод принимает 1 параметр:
$$("myReports").getService("local").getModels().then(sources => {
// делаем что-либо с моделями
});
Метод возвращает хэш источников данных:
Пример данных
{
companies: {id: "companies", name: "Companies", data: [...], refs: [...]},
persons: {id: "persons", name: "Persons", data: [...], refs: [...]},
products: {id: "products", name: "Products", data: [...], [...]},
sales: {id: "sales", name: "Sales", data: [...], refs: [...]}
}
Вы можете настроить связи для моделей (источников данных), задав свойство "refs" для модели. Это необходимо для объединения данных после выбора основного источника данных.
Например, модель "sales" содержит массив "refs" со следующими объектами:
refs: [
{id: 1, target: "places", source: "sales", name: "Place"},
{id: 2, target: "products", source: "sales", name: "Product"}
{id: 3, target: "persons", source: "sales", name: "Customer"}
],
Это значит, что модель "sales" может быть объединена с источниками данных "places", "products" and "persons". Обратите внимание, что основная и целевая модель должны иметь ссылки друг на друга.
Ниже приведен пример связи моделей:
{
"persons": {
"id": "persons",
"name": "Persons",
"data": [ /*...*/ ],
"refs": [
{
"id": 3,
"target": "persons",
"source": "sales",
"name": "Customer"
}
]
},
"sales": {
"id": "sales",
"name": "Sales",
"data": [ /*...*/ ],
"refs": [
{
"id": 3,
"target": "persons",
"source": "sales",
"name": "Customer"
}
]
}
}
Объекты модели (поля таблицы) также должны содержать ссылочную информацию. Например, "place_id" является ссылкой на модель "places":
{id: "place_id", name: "Place", type: "reference", ref: "places",…}
Запросы используются для фильтрации отчётов. Все запросы хранятся в коллекции данных. Чтобы получить коллекцию, вызовите метод getQueries() у сервиса Local.
const queries = $$("myReports").getService("local").getQueries();
Чтобы убедиться в том, что коллекция уже загружена, используйте метод waitData, который возвращает промис:
Получаем первый запрос
const queries = $$("myReports").getService("local").getQueries();
queries.waitData.then(function(){
queries.getItem(queries.getFirstId()); // получаем первый запрос
});
С помощью сериализации коллекции можно получить массив всех запросов:
Сериализация коллекции запросов
const queries = $$("myReports").getService("local").getQueries();
queries.waitData.then(function(){
const arr = queries.serialize(); // получаем массив запросов
/*[
{
id: 20,
models: ["companies", "persons"],
name: "myFilter",
text: { ...конфиг запроса },
value: "myFilter"
},
...
]*/
});
Related sample: Report Manager: Data Operations
Фасеты позволяют представлять отчеты в виде наборов данных, сгруппированных по определенным значениям выбранного столбца.
Например, если необходимо сгруппировать данные по столбцу "Product", в котором есть значения "Espresso" и "Cappucino", отчет должен отображать две таблицы или чарта (каждая таблица или чарт должны содержать данные для фасета "Product").
Чтобы включить возможность создания фасетов, откройте раздел Data модуля редактора, включите Facets и выберите столбец для которого будет создаваться фасет.
Вы также можете задать размер фасетов:
После того, как фасеты заданы, в конфигурационном объекте модуля появляются два новых свойства:
Массив facets включен в "data" request. Например, form data может быть такой:
columns: ["sales.count","sales.saledate","sales.total"]
facets: ["sales.country_id"]
...
В этом случае response - это массив фасетов. Каждый объект фасета включает два свойства:
Например:
[
{
data: [{sales.count: "4", sales.saledate: "2022-10-06T00:00:00Z"},…],
facets: [{column: "sales.country_id", value: "1"}]
},
{
data: [{sales.count: "3", sales.saledate: "2012-10-06T00:00:00Z"},…],
facets: [{column: "sales.country_id", value: "2"}]
},
{
data: [{sales.count: "2", sales.saledate: "2012-10-06T00:00:00Z"},…],
facets: [{column: "sales.country_id", value: "3"}]
}
]
Наверх