Перейти к содержанию

Индикаторы

Помимо стандартных преднастроенных индикаторов, в системе можно дополнительно настраивать кастомные индикаторы. Кастомные индикаторы удобно использовать:

  • для понимания количества задач определенного типа, ожидающих реакции пользователя;

  • для просмотра списка задач, отобранных по определенным критериям;

  • для создания новой задачи в определенной категории.

Порядок системных (стандартных) индикаторов строго зафиксирован в коде фронтенда и не может быть изменён через настройки. Стандартные индикаторы всегда отображаются в одном и том же порядке независимо от их расположения в списке.

Порядок строк в списке управляет только кастомными (настраиваемыми) индикаторами: он соответствует порядку их отображения в пользовательском интерфейсе в обратном порядке — в верхней части списка отображаются ближайшие к профилю кастомные индикаторы в панели навигации.

Список индикаторов

ℹ️ Частота обновления значений индикаторов настраивается на странице общих настроек приложения и происходит по-разному, если пользователь онлайн или офлайн. Если пользователь оффлайн, то обновление происходит с частотой, указанной в настройке "Интервал обновления в оффлайне (мин)". Если пользователь онлайн, то частота обновления равна "Время неактивности (мин)" / 5.

Для добавления нового индикатора, нажмите кнопку Создать. В открывшемся окне заполните параметры.

Для стандартных индикаторов должно быть заполнено поле Тип индикатора и при необходимости установлено ограничение для групп.

Для индикаторов, создаваемых для конкретного приложения, заполняются все необходимые поля (см. таблицу ниже).

ℹ️ Числовой индикатор поверх иконки отображается только для индикаторов на основе табличной функции SQL. Для остальных индикаторов отображается иконка, и по клику на нее открывается ссылка или список объектов.

Параметр

Описание

Текст ссылки

Название ссылки, которое будет всплывать при наведении мыши на индикатор. Может задаваться в виде текста или возвращаться смарт-выражением

Ссылка

Внутренняя или внешняя ссылка на страницу, которая будет отображаться по клику на иконку, если для индикатора выбрано действие "Открыть страницу из поля Ссылка" . Если выбрано иное действие, то поле может быть пустым.

Если ссылка начинается с символов http или https, то она интерпретируется как внешняя, если нет — как внутренняя страница "Первой Формы" (например, /NewCustomGrid.aspx?Type=YouPerformerTasks). Правила формирования внутренних ссылок можно посмотреть здесь.

Настройки индикатора

Тип индикатора

Для создания нового индикатора необходимо выбрать "Настраиваемый". Остальные значения являются стандартными типами индикаторов "Первой Формы".

Стандартные индикаторы:

  • Чаты

  • Пропущенные вызовы

  • Просроченные задачи

  • Ожидающие Вашей подписи

  • Непрочитанные комментарии

  • Неотвеченные вопросы

  • Мои вопросы

  • Избранные комментарии

  • Просроченные подписи

  • Новые задачи

  • Задачи на сегодня

  • Задачи в работе

  • Просроченные задачи без исполнителя

  • Задачи замещаемого сотрудника

В списках задач, которые открываются по нажатию на стандартные индикаторы, доступны к отображению все основные параметры задачи

Действие по клику на индикатор

Действие для настраиваемого типа индикатора.

Для настройки кастомного индикатора предварительно необходимо настроить произвольный источник данных, в его настройках также можно задать табличный вид — представление, в котором будет отображаться список задач по клику на индикатор.

Возможные действия:

  • Открыть страницу из поля "Ссылка" — будет открываться ссылка, указанная в поле "Ссылка" (см. выше),

  • Открыть список задач — будет открываться список задач, возвращаемых табличной функцией SQL (см. ниже),

  • Открыть список пользователей  --- будет открываться список пользователей, возвращаемых табличной функцией SQL (см. ниже),

  • Открыть список произвольных элементов — будет открываться список элементов, возвращаемых табличной функцией SQL (см. ниже). Для применения данной настройки для необходимо очистить поле "Табличная функция SQL" (необходимо во избежание конфликта между SQL-функцией и статическими параметрами), а затем нажать кнопку "Обновить". В противном случае индикатор в пользовательском режиме будет некликабельным.

Счетчик индикатора будет отображать количество возвращаемых задач, пользователей или элементов.

ℹ️ Для сохранения настройки индикатора, необходимо каждый раз очищать поле "Табличная функция SQL", иначе настройки будут сброшены.

Иконка

Файлы с иконками индикатора для веб-интерфейса и для мобильных устройств с дисплеем "ретина".

Ограничений по размеру файлов нет, но на панели индикаторов изображение ограничено размерами 36x36px для веб-интерфейса, и 72x72px для ретины.

Набор иконок хорошего качества можно скачать здесь (для интерфейса SPA это поле не используется).

Иконка ретина

Табличная функция sql

SQL-функция для выполнения действий  "Открыть список задач",  "Открыть список пользователей" или "Открыть список произвольных элементов".

Функция для индикатора должна принимать только один входящий параметр:

  • \@UserID int;

Функция должна возвращать таблицу.

Если функция возвращает список задач, то в таблице обязательно должна быть колонка TaskID.

Если функция возвращает список пользователей, то в таблице обязательно должна быть колонка UserID.

ℹ️ Если функция возвращает вычисляемые колонки, то их псевдонимы (alias) не должны совпадать с именами существующих колонок таблиц БД.

Количество записей в возвращаемом наборе выводится счетчике индикатора.

При настройке источника данных для индикатора укажите либо Табличную функцию SQL, либо Произвольный источник. Обратите внимание на важное правило совместимости: для индикаторов, созданных в старом интерфейсе администрирования и имеющих заполненные оба поля, система всегда будет использовать значение именно из поля Произвольный источник, игнорируя при этом табличную функцию SQL.

Функция для расчёта количества записей

SQL-функция для расчёта количества записей кастомного (настраиваемого) индикатора. Если настройка заполнена, будет вызвана функция UserMenuItemTIckers_refresh.

Примеры создания и использования функций-счетчиков:

MSSQL:

-- оригинальная функция-источник 
CREATE or alter FUNCTION [dbo].[fn_testTeam_ticker2] 
( 
 @UserID                int 
) 
RETURNS TABLE 
AS 
RETURN 
( 
SELECT 
         t.TaskID, 
         t.TaskText, 
         t.StateName, 
         k.DisplayName, 
         t.CreatedTime, 
         t.OrderedTime, 
         t.ExtParam7500Value, 
         t.ExtParam2454Value 
 FROM dbo.TasksInSubcat5641Denormalized as t with (nolock) 
 --inner join TasksInSubcat5574Denormalized as r with (nolock) on r.TaskId=t.parentTaskId 
 left join dbo.Users as k with (nolock) on k.UserID = t.ResponsiblePerformerId 
 WHERE ExtParam12133Value = 'Тестирование' 
         AND t.IsClosed = 0 
) 
GO 

-- табличная инлайнящаяся функция-счетчик 
create or alter function dbo.fn_testTeam_ticker2_COUNT_IF 
( 
 @UserID                int 
) 
RETURNS TABLE 
AS 
RETURN 
( 
SELECT        cnt = count(*) 
 FROM dbo.TasksInSubcat5641Denormalized as t with (nolock) 
 --inner join TasksInSubcat5574Denormalized as r with (nolock) on r.TaskId=t.parentTaskId 
 left join dbo.Users as k with (nolock) on k.UserID = t.ResponsiblePerformerId 
 WHERE ExtParam12133Value = 'Тестирование' 
         AND t.IsClosed = 0 
); 
GO 

-- табличная процедурная функция-счетчик 
create or alter function dbo.fn_testTeam_ticker2_COUNT_TF 
( 
 @UserID                int 
) 
returns @ret table 
( 
 cnt  int not null 
) 
as 
begin 

 insert        into @ret(cnt) 
 select        count(*) 
 FROM        dbo.TasksInSubcat5641Denormalized as t with (nolock) 
                 left join dbo.Users as k with (nolock) on k.UserID = t.ResponsiblePerformerId 
 WHERE        ExtParam12133Value = 'Тестирование' 
                 AND t.IsClosed = 0; 

 return; 

end; 
GO 

-- скалярная функция-счетчик 
create or alter function dbo.fn_testTeam_ticker2_COUNT_FN 
( 
 @UserID                int 
) 
RETURNS int 
AS 
begin 

 return 
 ( 
         SELECT        cnt = count(*) 
                 FROM dbo.TasksInSubcat5641Denormalized as t with (nolock) 
                 --inner join TasksInSubcat5574Denormalized as r with (nolock) on r.TaskId=t.parentTaskId 
                 left join dbo.Users as k with (nolock) on k.UserID = t.ResponsiblePerformerId 
                 WHERE ExtParam12133Value = 'Тестирование' 
                         AND t.IsClosed = 0 
 ); 

end 
GO 

update        ticker 
set                 
         SqlSPName = 'dbo.fn_testTeam_ticker2_нетТакой', 
         SQLSPCountName = 
         --'dbo.fn_testTeam_ticker2_COUNT_FN' 
         'dbo.fn_testTeam_ticker2_COUNT_IF' 
         --'dbo.fn_testTeam_ticker2_COUNT_TF' 
from        dbo.MenuItemTicker ticker 
where        ticker.SqlSPName = 'dbo.fn_testTeam_ticker2'; 

exec dbo.UserMenuItemTickers_refresh @DebugF = 00001; 
select * from dbo.UserMenuItemTickers; 
PG:

PG:

create or replace function dbo.fn_testTeam_ticker2_COUNT_IF 
( 
 p_UserID                int 
) 
returns table 
( 
   cnt  int 
) 
stable 
as 
$$ 
         SELECT        count(*) 
                 FROM dbo.TasksInSubcat5641Denormalized as t 
                 --inner join TasksInSubcat5574Denormalized as r with (nolock) on r.TaskId=t.parentTaskId 
                 left join dbo.Users as k  on k.UserID = t.ResponsiblePerformerId 
                 WHERE ExtParam12133Value = 'Тестирование' 
                         AND t.IsClosed = 0 
$$ 
language sql; 

-- 2 вариант: скалярная функция-счетчик. Принимает обязательно параметр типа int, возвращает тип int (или любой тип, приводимый к int) 
create or replace function dbo.fn_testTeam_ticker2_COUNT_FN 
( 
 p_UserID                int 
) 
returns int 
stable 
as 
$$ 
         SELECT        count(*) 
                 FROM dbo.TasksInSubcat5641Denormalized as t 
                 --inner join TasksInSubcat5574Denormalized as r with (nolock) on r.TaskId=t.parentTaskId 
                 left join dbo.Users as k  on k.UserID = t.ResponsiblePerformerId 
                 WHERE ExtParam12133Value = 'Тестирование' 
                         AND t.IsClosed = 0 
$$ 
language sql; 

-- прописываем одну из новых функций; старую SQLSPName можно при этом очистить; в любом случае приоритет имеет новое поле SQLSPCountName 
update        dbo.MenuItemTicker ticker 
set                SQLSPName = 'dbo.fn_testTeam_ticker2!!!', -- отсутствующая функция, чтобы быть уверенным, что используется функция-счетчик 
       SQLSPCountName = 
         'dbo.fn_testTeam_ticker2_COUNT_IF' -- вариант с табличной функцией из одной строки 
         --'dbo.fn_testTeam_ticker2_COUNT_FN' 
where         Id = 52 --ticker.SqlSPName = 'dbo.fn_testTeam_ticker2' 
; 

-- убеждаемся, что новые функции-счетчики прописаны в dbo.MenuItemTicker и корректно работают 
select * from dbo.MenuItemTicker where id = 52; 
select * from dbo.fn_testTeam_ticker2(8315); -- обычная старая табличная ф-ция, тут просто для сравнения 
select dbo.fn_testTeam_ticker2_COUNT_FN(8315); -- скалярная функция-счетчик 
select * from dbo.fn_testTeam_ticker2_COUNT_IF(8315); -- табличная функция-счетчик 

truncate table dbo.UserMenuItemTickers; -- для примера можно так предварительно очистить 
call dbo.UserMenuItemTickers_refresh(p_DebugF := true); -- жмем кнопку 
select * from dbo.UserMenuItemTickers order by menuitemtickerid; -- получаем результат 

ℹ️ Обязательно ознакомьтесь с рекомендациями для работы с PostgreSQL при создании функций, таблиц и представлений

Произвольный источник

Может быть использован в качестве источника настраиваемого кастомного индикатора.

Подробнее о произвольных источниках

При настройке источника данных для индикатора укажите либо Табличную функцию SQL, либо Произвольный источник. Обратите внимание на важное правило совместимости: для индикаторов, созданных в старом интерфейсе администрирования и имеющих заполненные оба поля, система всегда будет использовать значение именно из поля Произвольный источник, игнорируя при этом табличную функцию SQL.

Ограничить доступ к индикатору группами

Если поле заполнено — индикатор отображается только указанным группам. Если поле пустое — индикатор доступен всем.

--- Цвет индикатора

Одна из типовых схем отображения индикатора: белый шрифт на синем фоне или на красном фоне. Если в поле "Css иконки" (см. выше) есть настройки стиля, то они имеют преимущество

Набор иконок

Набор иконок для индикаторов в интерфейсе SPA. В настоящее время набор доступных иконок можно посмотреть здесь.

Доступно только для настраиваемого типа индикатора.

Иконка из набора

Название иконки из набора (с маленькой буквы, слова через подчеркивание. Например, иконку Calendar Today надо писать как calendar_today)

Доступно только для настраиваемого типа индикатора.

Для редактирования настроек уже существующего индикатора нажмите на него в списке.

Чтобы удалить индикатор, откройте его окно настроек и нажмите кнопку Удалить или выберите соответствующий пункт в контекстном меню строки.

ℹ️ Системные (стандартные) индикаторы не следует удалять. Если системный индикатор (например, «Избранные комментарии») нужно скрыть от пользователей — используйте поле «Ограничить доступ к индикатору группами»: укажите группы, которым индикатор должен быть виден, либо оставьте поле пустым, чтобы скрыть его для всех.

ℹ️ Количество всех записей на индикаторах в избранном и в списке задач категорий отображаются  с учётом доступа.

ℹ️ Индикаторы отображаются только в веб-интерфейсе, в мобильном приложении вместо индикатора можно использовать плитку на рабочем столе.

ℹ️ Кастомные счетчики отображаются на основании данных из таблицы UserMenuItemTickers

Примеры настройки кастомных индикаторов

ℹ️ Для отбора задач могут использоваться табличные функции SQL или ссылки в адресной строке. Количественные индикаторы поверх иконок отображаются только если указана табличная функция.

Описание входящих и выходящих параметров для табличных функций приведено в настройках индикаторов.

Индикатор для создания задачи:

Настройка индикатора для создания задачи:

Настройка индикатора для создания задачи Индикатор для просмотра списка задач в категории:

Настройка индикатора для просмотра списка задач из категории:

Настройка индикатора для просмотра списка задач из категории Индикатор для просмотра списка задач из табличной функции:

Настройка индикатора для просмотра списка задач из табличной функции:

Настройка индикатора для просмотра списка задач из табличной функции Функция для формирования списка задач:

ALTER FUNCTION [dbo].[NeedsEvaluate]
  /@UserID int/ 
)
RETURNS TABLE 
AS
RETURN 
(
  SELECT *
  FROM TasksInSubcat999Denormalized
  WHERE IsClosed = 0 AND ResponsiblePerformerID = @UserID
) 
Пример табличной функции для индикатора:

Функция возвращает незавершенные задачи со сроком, в которых пользователь является исполнителем.

ALTER FUNCTION [dbo].[performer_ticker]
(   
  @UserID int
)
RETURNS TABLE 
AS
RETURN 
(
SELECT distinct Tasks.TaskID

FROM Tasks WITH(NOLOCK)
JOIN TaskHelpers WITH(NOLOCK) ON Tasks.TaskID = TaskHelpers.TaskID AND TaskHelpers.UserID = @UserID AND TaskHelpers.WorkFinished = 0

WHERE Tasks.IsClosed = 0 AND Tasks.OrderedTime is not null                         
)
GO 

ℹ️ Если в табличных функциях право пользователя на просмотр задачи не проверяется косвенно (например, пользователь является заказчиком или исполнителем), то право доступа надо проверять напрямую по таблице UserTaskPermissions.

Для расчета количества записей в кастомных индикаторах используется функция UserMenuItemTickes_refresh. Примеры для MSSQL и PG доступны в соответствующем разделе.

Табличные функции для индикаторов

Ниже приведены примеры табличных функций, которые могут использоваться при настойке дополнительных счетчиков-индикаторов, расположенных в правом верхнем углу пользовательского интерфейса системы "Первая Форма". Описание входящих и выходящих параметров приведено в настройках индикаторов.

Незавершенные задачи, где пользователь является исполнителем:

ALTER FUNCTION <имя_функции> 
(   
  @UserID int
)
RETURNS TABLE 
AS
RETURN 
(

SELECT Tasks.TaskID, Tasks.Description                 -- Набор полей для табличного представления

FROM Tasks WITH(NOLOCK)
    JOIN UserTaskPermissions utp WITH(NOLOCK) 
        on utp.TaskID = Tasks.TaskID
    JOIN States WITH(NOLOCK) 
        on Tasks.StateID = States.StateID 
    LEFT JOIN TaskColor WITH(NOLOCK) 
        on TaskColor.TaskID = Tasks.TaskID AND TaskColor.UserID = @UserID

WHERE Tasks.IsOverdue = 1                               -- Отбор просроченных задач
AND Tasks.TaskID IN (                                 
  SELECT TaskHelpers.TaskID 
  FROM TaskHelpers WITH(NOLOCK) 
  WHERE TaskHelpers.WorkFinished = 0                 -- Отбор незавершенных задач
  AND TaskHelpers.UserID = @UserID                   -- Отбор задач, где пользователь является исполнителем
   ) 
)
GO 
Подразделение пользователя:

ALTER FUNCTION <имя_функции> 
(   
  @UserID int 
)
RETURNS TABLE 
AS
RETURN 
(
SELECT u.UserID, poru.Name                         -- Набор полей для табличного представления

FROM UserOrgStructureUnit uoru WITH(NOLOCK)       -- Выбор из таблицы орг.единиц пользователя
    JOIN Users u WITH(NOLOCK)                   -- Выбор из таблицы пользователей
        on uoru.UserID = u.UserID 
    JOIN OrgStructureUnit oru WITH(NOLOCK)       -- Выбор должности из таблицы орг.единиц
        on oru.Id = uoru.OrgStructureUnitId
    JOIN OrgStructureUnit poru WITH(NOLOCK)     -- Выбор подразделения из таблицы орг.единиц
        on poru.Id = oru.ParentID

WHERE uoru.UserID = @UserID
)
GO 
[Описание работы с индикаторами в прежнем интерфейсе администрирования](../archive/ticker_old_version.md)
Полезные ссылки

Индикаторы в пользовательском интерфейсе

Обращение к объектам из адресной строки браузера