С помощью пагинации (атрибута pagination
) можно создать представление для просмотра нескольких записей, удовлетворяющих какому-то фильтру, "по одной" с быстрым переключением между ними.
Реализуем интерфейс для просмотра актуальных задач пользователя с переключателями-стрелочками. При завершении или переносе задачи она пропадает из "подборки".
В данном примере: актуальная задача - задача в статусе "Новое"
, "В работе"
или "В ожидании"
с датой начала раньше сегодняшнего дня.
1). Делаем SQL-запрос задач, подходящих под условие
2). Отображаем их в виде формы
3). Добавляем пагинацию для отображения одной формы на странице
{
$owner array(reference(base.people)) null @{ caption = 'Ответственный' },
$status array(reference(pm.actions_stages)) null @{ caption = 'Статус' },
$start_date_before date null @{ caption = 'Дата начала до' },
$type array(reference(pm.actions_types)) null @{ caption = 'Тип действия' },
}:
SELECT
type,
subject,
sys_related_contact,
description,
parent_action,
stage,
start_date,
due_date,
responsible_contact,
completed_person,
completed_datetime,
{
ref: &pm.notes_for_action_timeline,
args: { id: actions.id }
} as action_notes @{
control = 'user_view',
form_block = 1,
}
FROM
pm.actions
WHERE
NOT actions.is_deleted
AND ($type IS NULL OR actions.type = ANY(($type)))
AND ($owner IS NULL OR actions.responsible_contact = ANY(($owner)))
AND ($status IS NULL OR actions.stage = ANY(($status)))
AND ($start_date_before IS NULL OR start_date <= $start_date_before)
ORDER BY
actions.start_date,
actions.priority DESC,
actions.stage DESC,
actions.id
FOR INSERT INTO
pm.actions
Отображаем их в виде формы с помощью атрибута @type = form
{
$owner array(reference(base.people)) null @{ caption = 'Ответственный' },
$status array(reference(pm.actions_stages)) null @{ caption = 'Статус' },
$start_date_before date null @{ caption = 'Дата начала до' },
$type array(reference(pm.actions_types)) null @{ caption = 'Тип действия' },
}:
SELECT
@type = 'form',
@title = 'Действия',
@block_sizes = array[ 7, 5 ],
type @{ form_block = 0 },
subject @{ form_block = 0 },
sys_related_contact @{ form_block = 0 },
description @{ form_block = 0, control_height = 250 },
parent_action @{ form_block = 0 },
stage @{ form_block = 1 },
start_date @{ form_block = 1 },
due_date @{ form_block = 1 },
responsible_contact @{ form_block = 1 },
completed_person @{ form_block = 1 },
completed_datetime @{ form_block = 1 },
{
ref: &pm.notes_for_action_timeline,
args: { id: actions.id }
} as action_notes @{ form_block = 1, control = 'user_view' }
FROM
pm.actions
WHERE
NOT actions.is_deleted
AND ($type IS NULL OR actions.type = ANY(($type)))
AND ($owner IS NULL OR actions.responsible_contact = ANY(($owner)))
AND ($status IS NULL OR actions.stage = ANY(($status)))
AND ($start_date_before IS NULL OR start_date <= $start_date_before)
ORDER BY
actions.start_date,
actions.priority DESC,
actions.stage DESC,
actions.id
FOR INSERT INTO
pm.actions
На данном этапе страница будет представляет их себя длинную "простыню" из форм-карточек задач.
Добавляем атрибут lazy_load
со значением per_page: 1
@lazy_load = {
pagination: {
per_page: 1
}
}
{
$owner array(reference(base.people)) null @{ caption = 'Ответственный' },
$status array(reference(pm.actions_stages)) null @{ caption = 'Статус' },
$start_date_before date null @{ caption = 'Дата начала до' },
$type array(reference(pm.actions_types)) null @{ caption = 'Тип действия' },
}:
SELECT
@type = 'form',
@title = 'Действия',
@block_sizes = array[ 7, 5 ],
@show_argument_editor = true,
@lazy_load = {
pagination: {
per_page: 1
}
},
type @{ form_block = 0 },
subject @{ form_block = 0 },
sys_related_contact @{ form_block = 0 },
description @{ form_block = 0, control_height = 250 },
parent_action @{ form_block = 0 },
stage @{ form_block = 1 },
start_date @{ form_block = 1 },
due_date @{ form_block = 1 },
responsible_contact @{ form_block = 1 },
completed_person @{ form_block = 1 },
completed_datetime @{ form_block = 1 },
{
ref: &pm.notes_for_action_timeline,
args: { id: actions.id }
} as action_notes @{ form_block = 1, control = 'user_view' }
FROM
pm.actions
WHERE
NOT actions.is_deleted
AND ($type IS NULL OR actions.type = ANY(($type)))
AND ($owner IS NULL OR actions.responsible_contact = ANY(($owner)))
AND ($status IS NULL OR actions.stage = ANY(($status)))
AND ($start_date_before IS NULL OR start_date <= $start_date_before)
ORDER BY
actions.start_date,
actions.priority DESC,
actions.stage DESC,
actions.id
FOR INSERT INTO
pm.actions
В результате этого запроса на FunQL получаем представление, которое отображает пользователю по одной записи на странице.
При изменении статуса на "Выполнено"
или при переносе задачи на дату, которая позже сегодняшней, запись перестает удовлетворять условию и пропадает из выборки.
Ссылка на пример на x.ozma.org