META

Простейший отчет с фильтрами

Типичная задача 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>