Простейший отчет с фильтрами
Типичная задача META - вывод списка объектов в виде отчета с фильтрами.
Обычно отчет представляет из себя одну таблицу с фильтрами. Script id такой основной таблицы рекомендуется называть "res", чтобы другим разработчикам было привычнее читать ваш код.
Код примера
<!--
Фильтрация
Атрибут page-search объединяет эти фильтры в общий блок пресетов.
Это позволяет пользователю быстрее находить фильтры и сохранять пресеты фильтров
-->
<script type="meta/sql" db-alias="meta_samples" label="Организация" id="org_ids" elem="me-select" order="1" span="4" elem-attrs='{"multiple":true}' page-search>
SELECT "organizationId" as id, name as name FROM "organization" order by name
</script>
<script type="meta/sql" db-alias="meta_samples" label="Статус" id="active_mode" elem="me-select" default="all" order="1" span="4" page-search>
SELECT t.* FROM (VALUES ('all', 'Все'), ('active', 'Активные'), ('no_active', 'Неактивные')) as t(id,name);
</script>
<!--
Основная таблица
Большие таблицы обычно делаем с order="100500", чтобы они всегда точно буду в самом низу.
elem-attrs c ключом native делает настройки по умолчанию для me-pivot, которые нужны для режима Анализ данных, который есть почти на всех таблоицах автоматически
-->
<script type="meta/sql" db-alias="meta_samples" id="res" entity-id="2629" label="Шаблон страницы по умолчанию"
elem-attrs='{"native": {
"cols": ["isActive"],
"rows": ["org_name"],
"vals": ["salary"],
"aggregatorName": "Сумма",
"menuLimit": 10000,
"rendererName": "Table With Subtotal",
"skipEmptyLines": true,
"unusedAttrsVertical": "horizontal"
}}'
elem-attrs='{"addObjectButton":{"title":"Сотрудник", "mode":"modal"}}'
order="100500" >
SELECT
-- Выбираемые поля
"employeeId",
employee."name",
"isActive",
"creationTime",
organization.name as org_name,
organization."workAfter" as org_work_after,
(CASE WHEN "isActive" THEN '' ELSE 'ЗАБЛОКИРОВАН' END) as "статус",
"salary"::int8,
-- Системная колонка - добавляет total в пагинатор и применяет параметры к колонкам
json_build_object(
'pager', json_build_object('total', count(*) over()),
'headers', json_build_array(
json_build_object('name', 'name', 'displayName', 'Имя'),
json_build_object('name', 'creationTime', 'displayName', 'Добавлен', 'parentColumn', 'name'),
json_build_object('name', 'isActive', 'displayName', 'Активный', 'parentColumn', 'name'),
json_build_object('name', 'статус', 'parentColumn', 'name', 'hideNameInParentColumn', true),
json_build_object('name', 'org_name', 'displayName', 'Организация'),
json_build_object('name', 'org_work_after', 'displayName', 'Время работы', 'parentColumn', 'org_name'),
json_build_object('name', 'salary', 'displayName', 'ЗП')
)
) as table_props_field
FROM "public"."employee"
inner join organization ON organization."organizationId" = employee."organizationId"
WHERE employee.name ILIKE ${env.search_text}
-- Фильтрация данных таблицы
[#if env.sp.org_ids?size>0]
AND employee."organizationId" IN ( :env.sp.org_ids )
[/#if]
[#if env.sp.active_mode?has_content]
[#if env.sp.active_mode = 'active']
AND employee."isActive"
[/#if]
[#if env.sp.active_mode = 'no_active']
AND NOT employee."isActive"
[/#if]
[/#if]
ORDER BY ${sort}, "creationTime" DESC
${pager}
</script>