api.web Ссылка на список на карточке объекта в веб-интерфейсе
- Ссылка на список на карточке объекта с минимальным набором параметров
- Ссылка на список на отдельной странице с минимальным набором параметров
- Ссылка на список с полным набором доступных параметров
- Методы билдера
- Особенности определения фильтров для некоторых типов атрибутов
Ссылка на список на карточке объекта с минимальным набором параметров
-
api.web.list(object, listContentCode)
Генерация ссылки на список объектов на карточке объекта с минимальным набором параметров.
Параметры метода:
- object — объект или UUID объекта, карточка которого открывается при переходе по ссылке. Object;
- listContentCode — код контента, на который будет производиться позиционирование. String.
Возвращает строку, содержащая URL-ссылку на контент со списком на карточке объекта.
Пример. Генерация ссылки на список на карточке объекта с минимальным набором параметров:
api.web.list('root$401','SpisokObektov')
Результат:
http://localhost:8080/sd/operator/?anchor=uuid:root$401!%7B%22tab%22:%22STAB100%22%7D!encoded_prms=encoded_text$596803
Ссылка на список на отдельной странице с минимальным набором параметров
Ссылка на список
-
api.web.list(listTitle, classFqn, attrGroup)
Генерация ссылки на список объектов на отдельной странице с минимальным набором параметров.
Параметры метода:
- listTitle — название списка. String;
- classFqn — код класса, к которому принадлежат объекты списка. String;
- attrGroup — код группы атрибутов, определенной во всех типах переданного класса, которая определяет колонки списка. String.
Возвращает:
- Строка, содержащая URL-ссылку на список объектов на отдельной странице.
- Пустая строка, если не определены обязательные атрибуты.
Права: для просмотра списка на отдельной странице пользователь должен обладать правами (группа "Другие права" — право "Просмотр списка объектов на отдельной странице"). Право может быть выдано лицензированным и нелицензированным пользователям.
Пример. Генерация ссылки на список на отдельной странице с минимальным набором параметров:
api.web.list('Название списка', 'serviceCall', 'system')
Результат:
http://localhost:8080/sd/operator/?anchor=list:!!encoded_prms=encoded_text$596802
Ссылка на список с полным набором доступных параметров
-
api.web.list(builder)
Генерация ссылки на список объектов на основании параметров, определенных в переданном {@link IListLinkDefinition}. Тип ссылки зависит от значения, возвращаемого методом {@link IListLinkDefinition#isOnCard()}:
- false — ссылка на отдельной странице;
- true — ссылка на карточке объекта.
Параметр метода:
- builder — инкапсулирует в себе параметры, необходимые для генерации ссылки на список объектов
Возвращает:
- Строка, содержащая URL-ссылку на список объектов.
- Пустая строка, если не определены обязательные атрибуты
Права: для просмотра списка на отдельной странице пользователь должен обладать правами (группа "Другие права" — право "Просмотр списка объектов на отдельной странице"). Право может быть выдано лицензированным и нелицензированным пользователям.
-
api.web.defineListLink(onCard)
Определение билдера, передаваемого в метод api.web.list(builder).
Параметр метода:
-
onCard — определяет тип генерируемой ссылки:
- false — ссылка на отдельной странице;
- true — ссылка на карточке объекта.
Возвращает: Объект для генерации ссылки на список объектов. Список формируется с учетом ограничений содержимого списка и расположения постраничной навигации указанные в шаблоне.
-
Пример 1. Генерация ссылки на список на отдельной странице с полным набором параметров:
def dpStartDay = api.date.createDateTimePointPredicate('DAY', 18, 'GE') //Число больше или равно 18
def dpStartMonth = api.date.createDateTimePointPredicate('MONTH', 8, 'EQ') //Месяц равен август
def startDate = [dpStartDay, dpStartMonth]
def datePointStart = api.date.createDateTimePointPredicates(startDate)
//Или можно через другую реализацию метода добавить все условия: день меньше или равно 28 и месяц равен август
def datePointEnd = api.date.createDateTimePointPredicates(['DAY', 28, 'LE'], ['MONTH', 8, 'EQ'] )
def builder = api.web.defineListLink(false).setTitle("Заголовок списка").setClassCode("userclass").setAttrGroup("system");
def filter = builder.filter();
filter.AND(
filter.OR('title', 'contains', 'other'),
filter.OR('metaClass', 'contains', 'userclass$UserType21')
)
.AND(
filter.OR('creationDate', 'fromTo', [new Date().parse("dd.MM.yyyy HH:mm", "29.03.2019 15:59"), null])
)
.AND(
filter.OR('linktosc', 'notContains', utils.get('serviceCall$6602'))
)
.AND(
filter.OR('state', 'titleNotContains', 'Закрыт')
)
.AND(
filter.OR('dateTime', 'fromToDatePoint', datePointStart) //Больше или равно 18 августа
)
.AND(
filter.OR('dateTime', 'fromToDatePoint', datePointEnd) //И меньше или равно 28 августа
)
builder.sortDesc('title').sortDesc('metaClass');
builder.setCases(['UserType21','UserType22']);
builder.setPaging('both');
builder.setUsers(['superUser$naumen','employee$6403','employee$6401']);
builder.setDaysToLive(2);
builder.setAttrCodes(['title','creationDate']);
//builder.setTemplate("TestovyiShablon");
//builder.setSimple();
api.web.list(builder);
Результат:
http://localhost:8080/sd/operator/?anchor=list:!!encoded_prms=encoded_text$6601
Пример 2. Построение ссылки на список объектов, если конструктор ссылки создается с помощью дескриптора списка типа "Список вложенных объектов", с объектами класса "Отдел" (ou), расположенный на карточке Компании.
def sourceDescriptor = api.listdata.createListDescriptor('root', 'ATestzQ05319M')
def defineDescriptor = api.listdata.defineListDescriptor(sourceDescriptor)
.setCases(api.types.newClassFqn('ou$ATest1ui9Coev'))
.setAttributeCodes('ou@ATest9C7tahHn', 'ou@title')
.setComplexFilters(api.listdata.createAndFilter(api.listdata.createOrFilter('ou@ATest9C7tahHn', 'contains', 'AT_Аскаридоз')))
.setRestrictionFilters(api.listdata.createAndFilter(api.listdata.createOrFilter('abstractBO@title', 'contains', 'БО_AT_Эпифиз')))
.setShowNestedInNested(true)
.create()
def jsonDefinition = api.listdata.defineDescriptorAsJson()
.filters()
.complex().show()
.restriction().hide()
def jsonDescriptor = api.listdata.listDescriptorAsJson(defineDescriptor, jsonDefinition)
def descriptor = api.listdata.createListDescriptor(jsonDescriptor)
def builder = api.web.defineListLink(descriptor, false)
.setUuid('root$801')
.setListCode('ATestzQ05319M')
.setTitle('AT_Пистик')
.setClassCode('ou')
.setAttrGroup('system')
return api.web.list(builder);
Результат:
http://localhost:8080/sd/operator/?anchor=list:!!encoded_prms=encoded_text$6601
Пример 3. Генерация ссылки на список на карточке объекта с полным набором параметров:
def builder = api.web.defineListLink(true).setUuid('root$401').setListCode('tab1list2');
def filter = builder.filter();
filter.AND(
filter.OR('title', 'contains', 'код-3'),
filter.OR('metaClass', 'contains', 'serviceCall$ACHsc')
)
.AND(
filter.OR('creationDate', 'fromTo', [new Date().parse("dd.MM.yyyy HH:mm", "19.07.2018 18:50"), new
Date().parse("dd.MM.yyyy HH:mm", "19.02.2019 10:00")])
)
.AND(
filter.OR('massProblem', 'contains', false)
)
.AND(
filter.OR('number', 'contains', 3),
filter.OR('number', 'contains', 2)
)
builder.sortDesc('title').sortDesc('creationDate');
builder.setDaysToLive(2);
//builder.setSimple();
api.web.list(builder);
Пример вызова метода с применением быстрой фильтрации:
def builder = api.web.defineListLink(true).setUuid('root$501').setListCode('SpisokObektov')
def filter = builder.filter();
filter.fastFilter(
filter.OR('title', 'contains', 'KKK')
);
builder.setPaging('bottom');
api.web.list(builder);
При указании атрибутов в методах sortAsc, sortDesc и всех методах билдера filter, если атрибут определён на уровне типа, то перед кодом атрибута необходимо указать код метакласса через разделитель @. Например, при задании фильтрации по атрибуту, определеному на уровне типа:
def builder = api.web.defineListLink(true).setUuid('root$501').setListCode('SpisokObektov');
def filter = builder.filter();
filter.fastFilter(
filter.OR('objClass$objType@extraDescr', 'contains', 'SC-101')
);
api.web.list(builder);
Общие методы билдера
- setTemplate — строка, содержащая код шаблона списков, которому будет соответствовать отображение полученного списка. Необязательный метод.
При отображении списка на отдельной странице в момент обработки ссылки проверяется точное соответствие:
- класса/типов шаблона классу/типам объектов самого списка (setClassCode);
- группы атрибута, указанной в шаблоне, группе атрибутов самого списка (setAttrGroup);
- типа списка "Простой/Сложный", указанного в шаблоне, типу самого списка (setSimple).
Если настройки не совпадают, то список не отображается и выводится сообщение об ошибке.
- setUsers — строка, содержащая UUID пользователей, которым доступна страница. Необязательный метод, по умолчанию значение пусто и особых ограничений к доступу к странице не применяется.
- setDaysToLive — продолжительность жизни ссылки в днях. Необязательный метод, по умолчанию берутся из параметра файле dbaccess.properties. Если значение в dbaccess.properties неуказано, то оно равно 30 дням.
Методы билдера для списка объектов
-
setListType — тип списка:
- пустое значение (по умолчанию) — список имеет тип "Список объектов";
- значение RelObjectList — список имеет тип "Список связанных объектов";
- значение ChildObjectList — список имеет тип "Список вложенных объектов".
-
setUuid — UUID объекта, относительно которого строится список связанных и вложенных объектов.
Используется (и обязателен) только если вызывается метод setListType и на его вход переданы значения RelObjectList или ChildObjectList.
В качестве объекта связи можно указать текущего пользователя или объект, связанный с ним. Для этого в метод передается константа currentUser. Чтобы указать объект, связанный с текущим пользователем, используется конструкция вида currentUser.attrCode1.attrCode2, в которой через точку можно указать коды атрибутов объектов типа "Ссылка на бизнес-объект".
Пример: currentUser.Parent.upperOU, где в качестве объекта связи будет взят объект, находящийся в атрибуте upperOU объекта currentUser.Parent. Если список строится относительно currentUser, то в интерфейсе пользователя для каждого пользователя будет свой список объектов, взятый из его атрибута.
-
setNested — демонстрация объектов:
- вложенных во вложенные — параметр "Показывать в списке объекты, вложенные во вложенные" в списках вложенных объектов;
- связанных со вложенными — параметр "Показывать в списке объекты, связанные с иерархией" в списках связанных объектов.
Возможные значения:
- true — в итоговый список попадут объекты, вложенные во вложенные и связанные со вложенными;
- false (по умолчанию) — не попадут.
Используется только если вызывается метод setListType и на его вход переданы значения RelObjectList или ChildObjectList.
-
attrChain — самостоятельный билдер, использующийся для задания иерархии объектов при построении "Списка связанных объектов".
Используется и обязателен, только если вызывается метод setListType со значением RelObjectList.
Билдер имеет следующие методы:
- attributesChain. В качестве параметра метода передается массив FQN атрибутов для цепи связи (с какого по какой будет связь), аналогично параметрам "Атрибут" и "Построить иерархию объектов (вниз), начиная с объекта".
- nestedHierarchyAttrFqn. В качестве параметра метода передается код атрибута в цепи ссылок, после которого строится иерархия, аналогично параметру "В иерархии потомки связаны с предками через атрибут". Используется и обязателен, только если вызывается метод setNested со значением true.
- nestedAttrLinkFqn. В качестве параметра метода передается код атрибута связи для вложенных объектов, аналогично параметру "Объекты иерархии связаны с объектами списка через атрибут". Используется (и обязателен) только если вызывается метод setNested со значением true.
-
relatedWithNestedParams — альтернативный метод задания параметра "Показывать в списке объекты, связанные с иерархией", в метод передаются три параметра аналогично тому, как они задаются при добавлении контента, а именно:
- цепочка атрибутов, соответствующая параметру "Построить иерархию объектов (вниз), начиная с объекта";
- код атрибута, соответствующего параметру "В иерархии потомки связаны с предками через атрибут";
- цепочка атрибутов, соответствующая параметру "Объекты иерархии связаны с объектами списка через атрибут".
- setTitle — заголовок страницы со списком объектов.
- setClassCode — строка, содержащая код класса, которому принадлежат объекты списка
- setCases — массив, содержащий список кодов типов класса, объекты которых будут отображаться в списке. Необязательный метод: по умолчанию показываются объекты всех типов класса из параметра setClassCode.
- setAttrGroup — строка, содержащая код группы атрибутов, определенной во всех типах из параметра выше, которая определяет колонки списка. Проверка на корректность указания группы атрибутов происходит на этапе работы метода.
- setAttrCodes — массив, содержащий перечисление кодов атрибутов из группы, указанной в методе setAttrGroup. Используется для уточнения набора колонок списка на основании переданного перечня кодов атрибутов (аналог "Настройки полей" в списке). Необязательный метод: по умолчанию набор колонок списка определяется группой атрибутов, переданной в методе setAttrGroup.
- setSimple — представление списка = "Простой список". Необязательный метод: по умолчанию список имеет представление "Сложный список".
-
setPaging — строка, определяющая расположение постраничной навигации (необязательный метод):
- both — "Над списком и под списком";
- top — "Над списком";
- bottom (по умолчанию) — "Под списком".
-
sortAsc — строка, содержащая перечисление кодов атрибутов, по которым будет производиться прямая сортировка списка.
Необязательный метод, по умолчанию сортировка к списку не применяется.
Для сортировки доступны атрибуты из группы атрибутов списка.
Для сортировки по нескольким атрибутам необходимо применить функцию на каждый атрибут в отдельности. Приоритет сортировки определяется порядком применения метода.
Допустима сортировка атрибутов, присутствующих в группе атрибутов (из setAttrGroup) во всех типах, указанных в setCases.
Сортировка не применяется при открытии ссылки в браузерах Internet Explorer 8 и 9.
-
sortDesc — строка, содержащая перечисление кодов атрибутов, по которым будет производиться обратная сортировка списка.
Необязательный метод, по умолчанию сортировка к списку не применяется.
Для сортировки доступны атрибуты из группы атрибутов списка.
Для сортировки по нескольким атрибутам необходимо применить функцию на каждый атрибут в отдельности. Приоритет сортировки определяется порядком применения метода.
Допустима сортировка атрибутов, присутствующих в группе атрибутов (из setAttrGroup) во всех типах, указанных в setCases.
Сортировка не применяется при открытии ссылки в браузерах Internet Explorer 8 и 9.
-
filter — представляет собой самостоятельный билдер, использующийся для задания ограничения содержимого списка (за исключением указанной быстрой фильтрации и ограничения настроек фильтрации, которые передаются в явном виде). Описание использования критериев фильтрации в механизме генерации ссылки на список см. Критерии фильтрации для атрибутов по типам
Билдер имеет следующие методы:
- AND. В метод AND в качестве параметра можно передавать значение, полученное применением метода OR.
-
OR. В качестве параметров метода передаются: код атрибута сортировки, код критерия фильтрации и значение фильтрации.
В качестве значения кода атрибута фильтрации можно передавать также перечисление ссылочных атрибутов через точку ".". Итоговая фильтрация будет применяться к последнему атрибуту в цепочке.
-
fastFilter — определяет быструю фильтрацию. В качестве параметра метода передается условие фильтрации filter.OR. Метод сообщает о формировании быстрой фильтрации списка.
Если для атрибута доступна фильтрация, но недоступна быстрая фильтрация (например атрибуты типов "Лицензия", "Счетчик времени"), то при передаче для таких атрибутов быстрой фильтрации фильтрация применяется верно, однако в операторе никак не отображается.
Указанная быстрая фильтрация применяется к формируемому списку как быстрая фильтрация, а не как ограничение содержимого списка.
-
fastSubstringFilter — определяет быструю фильтрацию по подстроке. В качестве параметра метода передается условие фильтрации filter.OR. Метод сообщает о формировании быстрой фильтрации списка по подстроке.
Если для атрибута доступна фильтрация, но недоступна быстрая фильтрация (например атрибуты типов "Лицензия", "Счетчик времени"), то при передаче для таких атрибутов быстрой фильтрации фильтрация применяется верно, однако в операторе никак не отображается.
Указанная быстрая фильтрация по подстроке применяется к формируемому списку как быстрая фильтрация по подстроке, а не как ограничение содержимого списка.
-
restrictionFilter — определяет ограничение настроек фильтрации списка. В качестве параметров метода передаются: код атрибута сортировки, код типа ограничения настроек фильтрации и значение фильтрации.
В качестве кодов критериев фильтрации доступны следующие значения:
- 'LIST' — соответствует ограничению по содержимому в списке. Указывать значение фильтрации в этом случае не нужно.
- 'SCRIPT' — соответствует ограничению скриптом. В качестве значения фильтрации в этом случае нужно указать код используемого скрипта.
В итоговой конструкции билдера на одном уровне не могут одновременно применяться методы AND и OR.
Необязательный метод, по умолчанию ограничение содержимого списка к списку не применяется.
Контекстные критерии фильтрации, локали пользователя, часовой пояс и другие параметры, от которых может зависеть фильтрация, определяются в момент построения списка в приложении и не передаются в ссылке.
Ограничение содержимого списка применяется к объектам из списка; для ограничения содержимого списка доступны все атрибуты класса объектов и атрибуты всех вложенных в него типов.
Допустима сортировка атрибутов, присутствующих в группе атрибутов (из setAttrGroup) во всех типах, указанных в setCases.
Особенности определения фильтров для некоторых типов атрибутов
Набор типов классов
Набор типов классов должен передаваться как коллекция ClassFqn. Для создания фильтра можно использовать следующую конструкцию:
filter.OR('setOfCases', 'contains', [api.metainfo.getMetaClass('userclass$UserType').getFqn()])
Атрибут
Значение в фильтрации определяется как DTObject, uuid которого равен AttributeFqn объекта.
Для создания фильтра можно использовать следующую конструкцию:
filter.OR('<код атрибута объекта списка>', '<критерий фильтрации>', api.metainfo.getMetaClass('<код класса объекта, с атрибутом которого сравниваем>').getAttribute('<код атрибута>').getAttributeFqn())
Пример фильтра:
filter.OR('title', 'containsUserAttribute', api.metainfo.getMetaClass('employee').getAttribute('lastName').getAttributeFqn())
Целое число
Целые числа должны передаваться как Long, указывая "L" в конце:
filter.OR('creationDate', 'lastN', 5L)
Статус счетчика
Статус счетчика должен передаваться как код: ACTIVE("a"), EXCEED("e"), NOTSTARTED("n"), PAUSED("p"), STOPED("s").
Пример фильтра для статусов "Активен" и "Кончился запас НВ":
filter.OR('timeAllowanceTimer', 'timerStatusContains', ['e','a'])
Для критерия фильтрации backTimerDeadLineContains доступны два варианта: Просрочен: "exceed", Не просрочен: "noExceed":
//filter.OR('timeAllowanceTimer', 'backTimerDeadLineContains', 'exceed')
filter.OR('timeAllowanceTimer', 'backTimerDeadLineContains', 'noExceed')
Дата/время
Можно фильтровать по атрибутам типа "Дата/время" по части даты/времени, например: "день недели равен ..." или "часы/минуты находятся в интервале от и до".
def dpStartMonth = api.date.createDateTimePointPredicate('DAY', 3, 'GE') //Больше или равно 3 числу
def dpStartYear = api.date.createDateTimePointPredicate('DAY', 20, 'LE') //меньше или равно 20 числу
def startDate =[dpStartMonth, dpStartYear]
def datePointStart = api.date.createDateTimePointPredicates(startDate)
//Или использовать более простую сигнатуру метода, чтобы задать сразу несколько условий:
def datePointStart = api.date.createDateTimePointPredicates(['DAY', 3, 'GE'], ['DAY', 20, 'LE'])
filter.OR('dateTime', 'fromToDatePoint', datePointStart)
Пример 1: в июле 2020 года
def datePointStart = api.date.createDateTimePointPredicates(['MONTH', 7, 'EQ'], ['YEAR', 2020, 'EQ'])
def filterBuilder = builder.filter();
filterBuilder.AND(
filterBuilder.OR('dateTime', 'fromToDatePoint', datePointStart),
)
Пример 2: с 28 августа 14.00 по 31 августа 14.00
def datePointStart = api.date.createDateTimePointPredicates(['DAY', 28, 'EQ'], ['MONTH', 8, 'EQ'], 'HOUR', 14, 'GE')
def datePointEnd = api.date.createDateTimePointPredicates(['DAY', 31, 'EQ'], ['MONTH', 8, 'EQ'], ['HOUR', 14, 'LE'])
def datePointMiddle = api.date.createDateTimePointPredicates(['DAY', 29, 'GE'], ['DAY', 30, 'LE'], ['MONTH', 8, 'EQ'])
def filterBuilder = builder.filter();
filterBuilder.AND(
filterBuilder.OR('dateTime', 'fromToDatePoint', datePointStart),
filterBuilder.OR('dateTime', 'fromToDatePoint', datePointMiddle),
filterBuilder.OR('dateTime', 'fromToDatePoint', datePointEnd)
)
Пример 3: с пятницы по вторник
def datePointStart = api.date.createDateTimePointPredicates(['WEEKDAY', 5, 'GE'], ['WEEKDAY', 7, 'LE'])
def datePointEnd = api.date.createDateTimePointPredicates(['WEEKDAY', 1, 'GE'], ['WEEKDAY', 2, 'LE'])
def filterBuilder = builder.filter();
filterBuilder.AND(
filterBuilder.OR('dateTime', 'fromToDatePoint', datePointStart),
filterBuilder.OR('dateTime', 'fromToDatePoint', datePointEnd)
)
Фильтрация по атрибуту UUID с единственным значением
Для фильтрации по UUID доступны все операторы, которые совместимы с атрибутами типа "Строка".
Также реализована фильтрация по равенству с помощью оператора equals. Оператор equals реализован исключительно для фильтрации по UUID, при попытке фильтрации оператором equals по любому другому атрибуту фильтрация будет игнорироваться.
Пример:
def builder = api.web.defineListLink(false)
.setTitle('Название списка')
.setClassCode('ou')
.setAttrGroup('system')
def filter = builder.filter()
filter.AND(filter.OR('UUID', 'equals', 'ou$2021'))
api.web.list(builder)
В результирующем списке будут отображаться все объекты ou, UUID которых равен ou$2021