Отображает результат как комментарии и события (как в Trello) с возможностью добавлять новые комментарии.
В качестве тела события отображаются все строки, не помеченные атрибутами timeline_datetime = true
, timeline_author = true
, timeline_type = true
, visible = false
.
Обозначения:
⚠️ - атрибут устарел (deprecated) и больше не поддерживаетсяИспользование:
Атрибуты представления и атрибуты строк начинаются с@
и могут быть указаны в любом месте блокаSELECT
Атрибуты колонок, ячеек и формы редактирования указываются после поля в блокеSELECT
в форматеfield_name @{ attribute = value }
Атрибут | Тип | Описание | Значение по умолчанию |
---|---|---|---|
buttons |
Массив кнопок | Дополнительные кнопки в «кебаб-меню» и рядом с ним | |
create_buttons |
Массив кнопок | Если нужно поддерживать несколько способов создания записи и поэтому create_link не подходит. Также добавит кнопки в шапку таблицы и «кебаб-меню», но с выпадающим списком |
|
create_link |
Действие | Ссылка на отображение, с помощью которого можно создавать новые записи данного типа. Создаёт кнопку «Создать новую запись» в «кебаб-меню» и кнопку "+" в шапке таблицы | |
disable_auto_save |
Логическое | Если true , то отключается автоматическое сохранение по таймеру, пока представление находится на экране (при этом всё ещё будут происходить сохранения при переходах между представлениями). Всегда отключено в представлениях, в которых на главной сущности имеются триггеры |
false |
export_to_csv |
Логическое | Включает возможность экспорта данных этого представления в csv файл | false |
⚠️extra_actions |
Массив действий | Дополнительные кнопки в «кебаб-меню» сверху (⚠️ см. buttons ) |
|
⚠️help_embedded_page_name |
Строка | Название страницы со справкой (⚠️ см. help_page ) |
|
help_page |
Cсылка | Ссылка на страницу-подсказку (funapp.embedded_pages ) - схема и название, подробнее |
|
⚠️panel_buttons |
Массив действий | Дополнительные кнопки на верхней панели представления (⚠️ см. buttons ) |
|
post_create_link |
Действие с идентификатором | Действие, которое осуществляется после сохранения новой записи (пример) | |
show_argument_button |
Логическое | Показывать ли по умолчанию кнопку "Фильтры", отобажающую редактор аргументов по клику | false |
show_argument_editor |
Логическое | Показывать ли по умолчанию редактор аргументов | false |
title |
Строка | Заголовок представления | Системное название представления |
type |
table , form , board , menu , timeline , multiselect |
Тип пользовательского представления | table |
Атрибут | Тип | Описание |
---|---|---|
timeline_datetime |
Логическое | Обязательне поле. Помечает, что в этой колонке хранится дата, по которой будет сортироваться таймлайн |
timeline_username |
Логическое | Помечает, что в этой колонке хранится юзернейм, для красивого отображения |
timeline_type |
'event' | 'message' |
Тип строки, событие или комментарий (просто по-разному отображается) |
timeline_message |
Логическое | Помечает, что новые комментарии будут записываться в эту колонку. Если ни одну колонку не пометить значением true , то возможности добавить комментарий не будет |
{
$id reference(pm.tasks)
}:
SELECT
@type = 'timeline',
@title = 'Комментарии к задаче',
note_datetime @{
timeline_datetime = true
},
author @{
timeline_username = true ,
default_value = $$user
},
message @{
timeline_message = true
},
type @{
timeline_type = true
},
task @{
default_value = $id,
visible = false
}
FROM
pm.notes_for_tasks
WHERE
task = $id
ORDER BY
note_datetime DESC -- Необязательно, представление сортируется по `timeline_datetime`
FOR INSERT INTO
pm.notes_for_tasks
Для добавления в таймлайн событий типа event
проще всего использовать триггеры на какие-либо действия в базе:
// trigger: AFTER INSERT into "pm.tasks"
import { getPersonName } from 'admin/user_info.mjs';
export default async function insertNote(event, args) {
const taskId = event.source.newId;
const now = new Date();
const author = await getPersonName() ?? args.author;
const msg = args.status
? `создал(а) задачу в статусе \"${args.status}\"`
: `cоздал(а) задачу`;
await addNote(taskId, now, author, msg);
return true;
}
async function addNote(taskId, date, author, message) {
await FunDB.insertEntity(
{ schema: 'pm', name: 'notes_for_tasks' },
{
note_datetime: date,
author: author,
message: message,
type: 'event',
task: taskId
});
}
Событие типа message
можно добавить в таймлайн без дополнительной автоматики. Единственным условием для добавления сообщения должно быть указание FOR INSERT INTO user.messages
.
По умолчанию, в качестве автора комментария вставляется строковое значение $$user
(public.users.name). Однако, можно заменить $$user
на ФИО связанного человека с помощью триггера:
// BEFORE INSERT into pm.notes_for_actions TRIGGER
export default async function handleEvent(event, args) {
const authorPersonName = await getPersonName();
if (authorPersonName)
args.author = authorPersonName;
return args;
}
// Get current user's Main Name (base.people.__main)`
async function getPersonName() {
queryStr = `SELECT __main as name FROM base.people WHERE user = $$user_id`;
viewExprResult = await FunDB.getUserView({ type: "anonymous", query: queryStr });
return viewExprResult.result.rows.length
? viewExprResult.result.rows[0].values[0].value
: null;
}