Типы данных
Общий обзор (Overview)
Тип данных - основной артефакт ECM, описывающий объект. В типе данных определяются метаданные, которые будет содержать объект, статусы жизненного цикла, роли, которые могут работать с объектом. Тип данных связан с формой и журналом.
Типы данных - артефакты с типом model/type.
В Citeck на основе типа данных создаются следующие артефакты:
Иерархия системных типов и логика их наследования
У каждого типа данных должен быть родитель. Базовые типы данных:
Кейс (case) - тип для хранения записи, изменяемой во времени посредстовом связи ее с бизнес-процессом (не явлется статической). Маркером того, что тип будет кейсом является необходимость прикрепления к нему процесса и указания при создании общей информации, атрибутов, ролей, статусов и матрицы прав.
Справочник (datalist) - тип для хранения наборов бизнес-данных, которые будут использоваться как статические данные для документов, не участвующие непосредственно в бизнес-процессах. Маркером того, что тип будет даталистом является указание при его создании только общей информации и перечня атрибутов.
В качестве родителя можно использовать созданный ранее тип данных.
Родительские атрибуты попадают в список наследуемых атрибутов (Атрибуты) и по флагу «Наследовать» можно наследовать форму, действия, шаблон нумерации.
Описание перехода к разделу через интерфейс
Для просмотра существующих типов и их редактирования создан журнал «Типы данных» (Рабочее пространство «Раздел администратора» - Модель):
По умолчанию в журнале не отображаются системные типы.
Для отображения ТОЛЬКО системных типов перейдите в настройки таблицы, выставите Системный тип - Да:
Варианты получения экземпляра типа
Тип данных можно создать или загрузить уже созданный в систему.
Создание
Подробнее см. раздел ниже
Для создания типа данных необходимо нажать + - Создать новый тип:
Откроется форма создания типа данных:
Загрузка
Для загрузки созданного типа данных необходимо нажать + - Загрузить тип:
Файл формата .yaml
Пример описания типа
id: hr-offices-type
name:
ru: Офисы
storageType: ECOS_MODEL
parentRef: emodel/type@data-list
formRef: uiserv/form@hr-offices-form
journalRef: uiserv/journal@hr-offices-journal
inheritActions: false
defaultCreateVariant: true
model:
attributes:
- id: officesCode
name:
ru: Код
- id: officesCity
name:
ru: Город
- id: officesAddress
name:
ru: Адрес
Доступные действия с записью
В журнале администратору с каждой записью доступен стандартный набор действий:
скачать в виде json-файла;
удалить;
открыть карточку в соседней вкладке;
открыть на редактирование;
редактировать json-файл;
копировать.
Создание нового типа
Форма создания нового типа состоит из следующих вкладок:
Основные – основные характеристики типа данных.
Атрибуты– характеристика, определяющая свойства объекта.
Аспекты– функционал расширения типа данных без изменения самого типа.
Роли – роли, которые участвуют в работе с объектом.
Статусы– статусы, по которым объект будет перемещаться по мере выполнения бизнес-процесса.
Стадии– этапы жизненного цикла документа.
Варианты создания – настройка поддержки выбора варианта создания после выбора типа
Связи – настраиваются для отображения, добавления и удаления связанных объектов в виджете «Связи»» на карточке объекта.
Конфигурация контента – настройки работы с содержимым (контентом).
Представления – настройки режима отображения данных в виде списка.
Основные
Родитель, форму, журнал, указанные по умолчанию можно изменять.
п/п |
Наименование |
Описание |
Пример заполнения |
|---|---|---|---|
1 |
Id (обязательное) |
уникальный идентификатор типа |
test_type (snake case) |
2 |
Имя |
локализованное название компонента |
Тестовый тип |
3 |
Шаблон отображения имени |
локализованный шаблон заголовка записи, отображаемого при запросах ее локализованного имени (расширеный вариант для параметра п.2).
Поддерживает выражения с использованием данных записи
|
Тестовый тип № ${counter} |
4 |
Описание |
локализованное описание данного типа (необязательно). |
Тип, используемый для тестовых целей |
5 |
Родитель |
тип данных, на основании которого, создается текущий. |
выбирается из списка предлагаемых:
Кейс (по умолчанию), Справочник, Документ, Файл библиотеки документов, Публикация
Остальное – иные созданные ранее типы данных, на основе которых можно создать новый тип.
|
6 |
Форма |
ссылка на форму, которая будет открываться при инициировании создания записи данного типа.
Наследование формы позволяет не заполнять в дочернем типе поле «форма», это поле в итоге заполнится значением из родительского типа.
|
есть вариант создания автоматически по умолчанию (Форма по умолчанию), создания вручную (Создать-Создать форму), загрузки (Создать-Загрузить форму). |
7 |
Журнал |
ссылка на журнал, который будет отображать записи данного типа |
есть вариант создания автоматически по умолчанию (Журнал по умолчанию), создания вручную (Создать-Создать журнал), загрузки (Создать-Загрузить журнал). |
8 |
Шаблон нумерации |
шаблон нумерации См. Шаблоны нумерации
Возможно наследование шаблона нумерации от родительского или же наоборот его запрет (управляется проставлением соответствующего флага).
|
выбирается из списка предлагаемых |
9 |
Форма дополнительной конфигурации типа |
форма для поля config, которое является произвольным объектом, с возможностью редактировать её, используя форму. |
|
10 |
Действия |
ссылки на действия, которые будут доступны в соответсвующем виджете всех записей данного типа, а также в журнале, связанном с типом (подробнее о действиях).
Возможно наследование действий от родительского или же наоборот его запрет (управляется проставлением соответсвующего флага)
|
выбирается из списка предлагаемых |
11 |
Тип источника данных |
хранилище, в которое будут заноситься записи данного типа (название отражает не использумую БД, а сервис, в БД которого будут направляться запросы). Значение «По умолчанию» означает, что для места хранения будет использоваться «ID источника данных (12)» из текущего или родительского типа и при этом не будет никакого автоматического создания хранилища. Т.е. при типе источника данных «По умолчанию» предполагается, что место хранения уже подготовлено заранее. |
выбирается из списка предлагаемых. |
14 |
ID источника данных |
идентифтикатор источника для случая, когда используется хранилище не встроенное по умлочанию в систему (в случае когда в п.14 выбран выриант Custom). |
test_datasource (snake case) |
13 |
Видимость в рабочих пространствах |
- По умолчанию – назначается типу данных по умолчанию.
- Приватная – экземпляры типа данных доступны в рамках рабочего пространства, в котором созданы.
- Публичная – экземпляры типа данных доступны пользователям в соответствии с правами, не зависимо от рабочего пространства, в котором созданы.
|
|
14 |
Рабочее пространство по умолчанию |
в каком рабочем пространстве будет отображаться по умолчанию |
|
15 |
Политика проверки прав при поиске |
позволяет настроить поиск с проверкой прав непосредственно записи, её родителя или вовсе отключить проверку прав при поиске.
В любом режиме результат поиска дополнительно проверяется на наличие доступа.
|
|
16 |
Канбан доска |
выбор канбан-доски См. Канбан-доска |
Создание и редактрование журнала, формы из типа данных
Рассмотрим на примере журнала:
При нажатии на «Создать-создать журнал» открывается форма создания журнала:
При нажатии на «Создать-загрузить журнал» открывается форма загрузки журнала:
Функциональность реализована в настройках компонента Select Journal во вкладке «Кастомные»
При нажатии на «Изменить» открывается журнал, содержащий все созданные в системе журналы:
При нажатии на Редактировать открывается форма редактирования соответствующей выбранной сущности на новой вкладке.
Атрибуты
п/п |
Наименование |
Описание |
Пример заполнения |
|---|---|---|---|
1 |
Id |
идентификатор поля, по которому оно будет доступно на форме, в журнале. |
testAttribute (camelCase) |
2 |
Имя |
имя поля для отображения пользователю. |
Тестовый атрибут |
3 |
Тип |
тип поля. Поддерживаемые типы |
выбирается из списка предлагаемых. По умолчанию выставляется text. |
4 |
Множественный |
множественный ввод разрешен |
флаг |
5 |
Обязательный |
поле обязательно к заполнению |
флаг |
6 |
Настройка прав для атрибута |
функционал, позволяющий произвести настройку прав доступа в отношении «Роль-Статус» для конкретного атрибута. См. подробно |
выбирается состояние доступа атрибута на пересечении сетки «Роль-Статус» |
7 |
Вычисляемые атрибуты |
функионал, позволяющий установить выражение-зависимость, позволяющий гибко создавать производные атрибуты См. подробно |
настройка конфигурации в зависимости от типа и сложности вычисления атрибута |
8 |
Наследуемые атрибуты |
отображение значений наследумых от родительского типа атрибутов в соответсвии с п. 1, 2 и 6 (при условии что родительский тип задан и имеет атрибуты) |
отсутствует |
9 |
Настройка прав для типа данных |
функционал, позволяющий произвести настройку прав доступа документа в отношении «Роль-Статус».
А также выгрузить и удалить полную схему прав (включая настройки из п.6) См. подробно
|
выбирается состояние доступа документа на пересечении сетки «Роль-Статус» |
Возможные типы атрибутов:
Вычисляемые атрибуты
Тип - тип вычисляемого атрибута. Поддерживаются:
Script - вычисление атрибута на основе
javascript'а;Attribute - вычисление атрибута на основе другого атрибута (можно делать алиас на глубоко вложенный атрибут. Например:
counterparty.idocs:fullOrganizationName?str);Значение - константное значение;
Counter - значение будет генерироваться по счетчику при создании документа и не меняться со временем.
Template - шаблонная строка. Можно использовать вставки вида ${…}. Например:
${someAttribute?str}. Вместо данного плейсхолдера будет подставлено значение укзанного атрибута;
Метод хранения - тип сохранения. Определяет, нужно или нет сохранять вычисленное значение и если да, то в какие моменты. Возможные значения:
None - сохранение не нужно. При каждом обращении вычисляем значение заново;
On empty - сохранять вычисленное значение только если сохраненное значение отсутствует (т.е. при запросе значения вернулся
null);On create - сохранять вычисленное значение только после создания. Последующие мутации никак данный атрибут не затронут и он будет работать как обычный атрибут.
On mutate - сохранять вычисленное значение при каждой мутации. В случае использования Records API для изменения записи гарантируется актуальность значения.
Возможности атрибута с типом script
Объекты в глобальной области видимости:
Records - адаптер для RecordsService; |
Методы:
|
value - текущий документ; |
Свойства
Методы:
Пример:
Вычислить атрибут на основе трех других:
|
log - логгер. |
[уточнить] |
Предупреждение
Прикладных сервисов в контексте скрипта нет.
Примеры
Заполнение инициатора (initiator) текущим пользователем:
Матрица прав
Матрица прав - таблица, которая показывает, какими правами обладает конкретная роль на отдельные виды данных.
Права могут быть настроены отдельно на документ, отдельно на его атрибуты.
Матрицы, созданные для типов данных хранятся в журнале Матрицы.
Настройка прав
Настройка прав осуществляется на форме редактирования типа во вкладке Атрибуты.
Права на документ:
Важно
Чтобы сформированные по умолчанию права на документ вступили в силу, нажмите Сохранить
Права на атрибут:
Важно
Чтобы сформированные по умолчанию права на атрибут вступили в силу, нажмите Сохранить
Важно
Если пользователь участвует одновременно в нескольких ролях, то получает наибольшие права из тех, что ему доступны согласно матрице.
Важно
При разработке модуля необходимо по соответствующей кнопке скачать матрицу прав. Полученный json поместить в модель по пути: app/artifacts/model/permissions
Настрока прав на атрибуты в зависимости от каких-либо алгоритмов
В конфигурации матриц прав есть массив rules:
data class PermissionRule(
val roles: Set<String> = emptySet(),
val permissions: Set<String> = emptySet(),
val statuses: Set<String> = emptySet(),
val condition: Predicate = VoidPredicate.INSTANCE,
val type: RuleType = RuleType.ALLOW
)
Через правила можно писать кастомные условия для включения/отключения правила и реализовать с помощью вычисляемых атрибутов почти любую логику.
Если не хватает вычисляемых атрибутов, то есть внешние миксины, которые можно реализовать в кастомном микросервисе.
Настройка доступа к атрибуту только, если автор записи/пользователь относится к определённой группе
Для того чтобы узнать принадлежит ли текущий пользователь к группе можно использовать компонент AsyncData в разделе Данные:
Тип: Запись
ID записи: emodel/person@{{user}}
Атрибуты:
isAdmin -> authorities._has.GROUP_ECOS_ADMINISTRATORS?bool
(пример с группой администраторов)
Имя свойства: ИМЯ_ПО_КОТОРОМУ_МОЖНО_ПОЛУЧИТЬ_РЕЗУЛЬТАТ_ВЫЧИСЛЕНИЙ
В связанном поле, которому нужны данные из AsyncData, нужно добавить Обновлять при с указанием созданной AsyncData и после этого в логике можно ссылаться на данные в AsyncData.
При этом важный момент - логику не нужно делать в обе стороны (показать поле и скрыть). Нужно настроить компонент по дефолту (скрыто поле или не скрыто) + логику, которая переводит компонент в другое состояние. Если вдруг условия для логики перестанет выполняться, то форма сама вернется к исходному состоянию.
Для получения статуса редактируемой записи можно так же использовать AsyncData с ID записи {{recordId}}.
Ее можно открыть действием Тестировать форму.
Вычисление прав
Вычисление прав для PermissionsDef (документа или атрибута) делится на два этапа:
1. Применение матрицы прав <Роль, <Статус, Уровень_прав>>. Есть 3 уровня прав:
NONE - нет прав;
READ - чтение;
WRITE - чтение и запись.
2. Применение правил. Правила нужны в случаях, когда логика распределения прав не укладывается в простую матрицу. Примеры:
Если есть 2 состояния документа в одном статусе, но с разными правами;
Если уровень прав зависит от атрибутов документа.
Значения, которые вычисляются на этапах 1 и 2 должны быть абсолютными. Т.е. если у нас есть конфигурация прав, то она на 100% описывает текущий уровень прав и не предполагает наличие дополнительных механизмов.
Роли и статусы берутся из конфигурации типа. Если какой-то роли или статуса нет в конфигурации типа, то наличие этих сущностей в конфиге прав игнорируется.
Если для роли, статуса или атрибута нет настройки прав, но они присутствуют в типе, то по умолчанию выставляется право только на чтение.
Если у документа выставлен статус или есть роль, которые отсутствуют в конфиге типа, то права для них по умолчанию пустые (нет возможности даже читать).
Пограничные условия
Данные условия относятся к настройкам матрицы без системных статусов и ролей.
Статус есть в типе |
Статус есть в матрице |
Роль есть в типе |
Роль есть в матрице |
Уровень прав |
|---|---|---|---|---|
Да |
Да |
Да |
Да |
Из матрицы |
Да |
Да |
Да |
Нет |
Чтение |
Да |
Да |
Нет |
Да |
Нет прав |
Да |
Да |
Нет |
Нет |
Нет прав |
Да |
Нет |
Да |
Да |
Чтение |
Да |
Нет |
Да |
Нет |
Чтение |
Да |
Нет |
Нет |
Да |
Нет прав |
Да |
Нет |
Нет |
Нет |
Нет прав |
Нет |
Да |
Да |
Да |
Нет прав |
Нет |
Да |
Да |
Нет |
Нет прав |
Нет |
Да |
Нет |
Да |
Нет прав |
Нет |
Да |
Нет |
Нет |
Нет прав |
Нет |
Нет |
Да |
Да |
Нет прав |
Нет |
Нет |
Да |
Нет |
Нет прав |
Нет |
Нет |
Нет |
Да |
Нет прав |
Нет |
Нет |
Нет |
Нет |
Нет прав |
Системные статусы и роли
При необходимости можно настроить в типе системные статусы и роли. Для этого достаточно указать ID равным одному из предопределенных значений:
Роли:
EVERYONE - виртуальная роль, к которой относятся все пользователи. Assignees у такой роли всегда пустые, но если роль EVERYONE по матрице получает права, то они распространяются на всех пользователей в системе.
Статусы:
EMPTY - пустой статус. Полезен для приватных сущностей, которые недоступны на чтение всем пользователям в системе. Пустой статус может быть в случае если процесс для кейса не найден или операция старта процесса еще не завершилась;
ANY - любой статус. Вариант использования: для справочников можно задать права для ANY и EVERYONE на чтение, а для изменения записей завести отдельную группу.
Например в модуле Офферы для справочного типа данных Грейды:
Модель описания прав
Основная логика находится в библиотеке ecos-model-lib.
Конфигурация прав хранится в микросервисе ecos-model.
TypePermsDef
id: String // Идентификатор настроек. Уникальный в пределах системы
typeRef: RecordRef // Тип данных, к которому относятся настройки прав
permissions: PermissionsDef // Настройка прав на документ
attributes: Map<String, PermissionsDef> // Настройка прав на атрибуты
PermissionsDef
matrix: Map<String, Map<String, PermissionLevel>> // Матрица прав <Роль, <Статус, Уровень_прав>>.
rules: List<PermissionRule> // Дополнительные правила для гибкой настройки
PermissionLevel (enum)
NONE // нет прав
READ // права на чтение
WRITE // права на чтение и запись
PermissionRule
roles: Set<String> // Роли, для которых применяется правило
permissions: Set<String> // Список прав
statuses: Set<String> // Статусы, в которых данное правило применимо. Пустой список - любой статус
condition: Predicate // Условие, по которому данное правило применимо в формате предиката (см. Язык предикатов).
type: RuleType // Тип правила
RuleType (enum)
ALLOW - разрешение. Если правило активно, то permissions добавляются для указанных ролей
REVOKE - отбирание прав. Если правило активно, то permissions убираются из списка уже существующих прав у ролей
Наследование прав
При поиске матрицы прав учитывается иерархия типов данных. При этом ищется первая не пустая конфигурация и дальше поиск прекращается. Т.е. никакого объединения настроек прав из разных типов не происходит.
Пример конфигурации
id: "2a5c3f00-06d5-4b62-8192-1b9116f12db4"
typeRef: "emodel/type@contracts-cat-doctype-contract"
permissions
matrix:
confirmers:
approval: WRITE
reworking: NONE
initiator:
approval: READ
reworking: WRITE
scan-man:
approval: WRITE
reworking: NONE
rules: []
attributes::
name:
matrix:
confirmers:
approval: WRITE
reworking: NONE
initiator:
approval: READ
reworking: WRITE
scan-man:
approval: WRITE
reworking: NONE
rules: []
title:
matrix:
confirmers:
approval: WRITE
reworking: NONE
initiator:
approval: READ
reworking: WRITE
scan-man:
approval: WRITE
reworking: NONE
rules: []
Обновление прав в БД
Права в БД на данный момент обновляются только при изменении записи или при явном вызове перерасчета прав. Т.е. если в роль добавить человека напрямую или добавить новую роль к типу и/или изменить матрицу прав, то перерасчет для уже созданных записей автоматически не произойдет. Чтобы пересчитать права можно выполнить следующий javascipt код в консоли браузера от имени пользователя с правами администратора:
var rec = Records.get('emodel/update-permissions@');
rec.att('typeRef', 'emodel/type@type-to-update');
await rec.save();
Обработка будет запущена асинхронно. Статус можно будет смотреть в логах микросервиса ecos-model.
Если записей сотни, то обработка не должна занять больше 10-15 секунд.
Аспекты
Выберите спект из списка. По кнопке «Настроить» можно отредактировать конфигурацию - открывается форма, настроенная для аспекта.
Атрибуты из добавленных аспектов будут доступны в создаваемом типе данных.
Роли
п/п |
Наименование |
Описание |
Пример заполнения |
|---|---|---|---|
1 |
Id |
уникальный идентификатор роли |
myTestRole (camel case) |
2 |
Название логики |
имя роли |
Тестовая роль |
3 |
Участники роли |
статическое заполнение роли.
Выбор группы и/или отдельных пользователей из оргструктуры, которые будут выполнять функцию данной роли.
|
выбирается из списка оргуструктуры организации |
4 |
Атрибуты |
динамическое заполнение роли. Выбор атрибута типа, на который будет ссылаться роль для получения назначаемых пользователей. |
выбирается из списка предлагаемых атрибутов |
5 |
Динамическая роль |
динамическое заполнение роли. Возможные варианты: Script, Attribute, Значение, DMN. См. подробно
Установление произвольной гибкой логики, по которой будет произведено вычисление состава пользователей роли.
|
настройка конфигурации в зависимости от сложности и набора заивисимых данных для вычисления состава роли |
Примечание
Если пользователь или группа есть в любом из трех полей Участники роли, Атрибуты, Динамическая роль, то считается что пользователь/группа является представителем роли. т.е. происходит объединение по ИЛИ.
Тип роли DMN
При выборе типа DMN необходимо выбрать опубликованное Решение из журнала.
Статусы
п/п |
Наименование |
Описание |
Пример заполнения |
|---|---|---|---|
1 |
Id |
уникальный идентификатор статуса |
testStatus (camel case) |
2 |
Название логики |
имя статуса |
Тестовый статус |
3 |
Статус по умолчанию |
выбор статуса по умолчанию для типа, с которым будет создаваться объект. |
выбирается из списка предлагаемых. Например, черновик.
Частый кейс - использования функционала черновика, где bpmn процесс еще не запущен, но необходимо, чтобы рекорд имел какой-то начальный статус.
|
На форме документа статус может быть отражен следующим образом:
В компоненте Text field:
название поля может быть любым,
имя свойства - _status,
скрыть и заблокировать на ввод, если необходимо не отображать на форме.
Стадии
Стадии — этапы жизненного цикла документа. В каждую стадию входит один или несколько статусов.
Прежде, чем приступить к работе над стадиями, необходимо заполнить Статусы.
п/п |
Наименование |
Описание |
Пример заполнения |
|---|---|---|---|
1 |
Название стадии |
Наименование стадии |
testStage (camel case) |
2 |
Статусы |
Перечень статусов, входящих в стадию |
Выбирается из списка предлагаемых статусов |
Каждый статус может быть назначен только на одну стадию:
Стадии отображаются в виджете виджете «Стадии»
Варианты создания
Настройка поддержки выбора варианта создания после выбора типа настраиваются на вкладке Варианты создания
п/п |
Наименование |
Описание |
Пример заполнения |
|---|---|---|---|
1 |
Id |
уникальный идентификатор варианта создания |
testCreate (camel case) |
2 |
Имя |
имя поля для отображения пользователю. |
Тестовый статус |
3 |
Форма |
выбор формы для варианта создания |
|
4 |
Разрешен для |
пользователь или группа, для которых разрешен функционал. |
|
5 |
Дополнительно |
дополнительные настройки. |
|
6 |
Вариант создания по умолчанию |
Нужно или нет автоматически сгенерировать вариант создания для типа |
|
7 |
Добавить варианты создания дочерних типов |
Нужно или нет в списке вариантов создания текущего типа отображать варианты создания дочерних типов |
|
8 |
Действие после создания |
Возможность настроить действие после создания карточки.
Если ничего не выбрать, то по умолчанию будет открываться карточка записи.
Если выбрать Действие отсутствует (none), то после создания карточки не будет перехода на карточку.
Данная настройка наследуется от родительского типа и для базового типа data-list из коробки установлено действие none.
|
Ограничение прав на создание
Создание можно ограничить через настройку вариантов создания. «+» в журнале и пункт в меню «Создать» появляются только, если для пользователя есть доступные варианты создания.
В настройке типа можно отключить вариант создания по умолчанию и добавить новый с указанием групп, которые будут иметь к нему доступ. Заполнение имени и формы опционально. Если оставить эти поля пустыми, то они вычислятся автоматически.
Связи
п/п |
Наименование |
Описание |
|---|---|---|
1 |
Id |
идентификатор связи. Обязательное поле (если не заполнено, то сервер такую связь не сохраняет).
Это поле нужно для:
1. Перезаписывания конфигурации связи в дочернем типе. Т.е. если мы в дочернем типе укажем тот же ID, то по сути перезатрем конфигурацию связи
2. Указания атрибута, в котором связь сохранится (если не задано значение в поле «Атрибут»)
|
2 |
Имя |
имя связи для отображения в интерфейсе |
3 |
Атрибут |
в который новые связи будут добавляться и из которого будут загружаться.
Как правило это ассоциация из вкладки Атрибуты. Если не задано то используется значение поля ID.
|
4 |
Направление связи |
определяет какие связи отображать в виджете связей. Любая связь строится по принципу SOURCE -> TARGET
- SOURCE - обратная к TARGET связь у источника. При открытии карточки TARGET мы увидим нашу связь. При открытии карточки SOURCE мы ничего не увидим.
- TARGET - связь отображается только у документа, который хотим привязать. При открытии карточки TARGET мы ничего не увидим. При открытии карточки SOURCE мы увидим нашу связь.
- BOTH - двухсторонняя связь. И на карточке SOURCE и на карточке TARGET увидим нашу связь.
|
5 |
Связанный тип |
тип сущностей, с которыми мы можем связать наш документ. |
6 |
Журналы |
список журналов, которые можно использовать для создания новой связи. Если необходимо создавать связи не с одним определенным типом. |
7 |
Загружать список журналов из целевого типа |
загрузка списка журналов из типа данных.
Возможные значения - null, true, false.
|
Пример:
Связи (associations) настраиваются для отображения, добавления и удаления связанных объектов в виджете формы «Связи документов» на карточке объекта.
Связь документа с простой ссылкой
Для добавления возможности связать документ с простой ссылкой (Id - webLinks, Направление связи - Target):
Связь в обе стороны
Для связи в обе стороны необходимо, чтобы у источника ассоциации и у цели ассоциации была настроена ассоциация в типе с одним ID.
Простой пример настройки связей:
Создадим 2 типа данных:
Sons:
|
|
Dad:
|
Son зададим ассоциацией:
|
Заполним журнал Sons элементами:
Заполним Dad - добавим к нему sons:
Случай 1. Чтобы у Dad в виджете «Связи» отображались Sons. Для этого необходимо:
Перейти в тип данных Dad во вкладку «Связи», настроить:
Идентификатор связи.
Наименование связи, которое будет использоваться в виджете.
Атрибут, в который новые связи будут добавляться и из которого будут загружаться.
Направление связи. Source является Dad, target, соответственно, Sons.
Тип данных. Для добавления элементов в виджете по нажатию +, и правильного отображения столбцов в нем.
Перейти в журнал Dad, открыть карточку:
Случай 2. Чтобы у каждого Son в виджете «Связи» отображался его Dad. Для этого необходимо:
Перейти в тип данных Sons во вкладку «Связи», настроить:
Идентификатор связи.
Наименование связи, которое будет использоваться в виджете.
Атрибут, в который новые связи будут добавляться и из которого будут загружаться.
Направление связи. Source является Son, target, соответственно, Dad.
Тип данных. Для добавления элементов в виджете по нажатию +, и правильного отображения столбцов в нем.
Перейти в журнал Sons, открыть карточку:
Конфигурация контента
Работа с контентом в Citeck осуществляется с использованием атрибутов типа данных с типом «Содержимое».
Атрибут _content
Атрибут _content служит для доступа к основному контенту записи без необходимости узнавать в каком именно атрибуте
хранится контент. По умолчанию атрибут с контентом - content, но этот атрибут можно переопределить в типе во вкладке Конфигурация контента.
При загрузке нового контента в свойство _content имя содержимого записывается в свойство name сущности (если оно определено в атрибутах).
Контент в свойстве _content всегда имеет имя, которое совпадает с именем сущности (оно переопределяет имя самого контента).
Настройка типа
п/п |
Наименование |
Описание |
|---|---|---|
1 |
Атрибут с основным контентом |
атрибут, в котором находится контент, который доступен через свойство
_content.Может быть сложным с указанием свойства из связанной сущности. Например - linkedRecord.content.
Если это поле оставить пустым, то основным полем с контентом будет content.
|
2 |
Тип хранилища |
хранилище, где будет сохраняться контент.
По умолчанию “local“, что в свою очередь означает, что контент будет сохраняться в БД в той же схеме, что и таблица сущностей создаваемого типа данных.
Подробно о смене типа хранилища.
|
3 |
Атрибут с контентом для предпросмотра |
атрибут, в котором находится контент, который будет использоваться для предпросмотра документа.
Если не указать значение, то используется «Атрибут с основным контентом»
|
Java
Для работы в java с контентом следует использовать интерфейс EcosContentApi:
Загрузка:
EntityRef tempFile = contentApi.uploadTempFile()
.withMimeType("application/pdf")
.writeContent((writer) -> writer.writeBytes(imageContent1));
ObjectData attributeForMutation = ObjectData.create()
.set("customContentAtt", tempFile);
// Создание
EntityRef newFileWithContent = recordsService.create("emodel/test", attributeForMutation);
// Обновление
recordsService.mutate(newFileWithContent, attributeForMutation);
Чтение:
EntityRef ref = EntityRef.valueOf("emodel/test@localId");
EcosContentData contentData = contentApi.getContent(ref, "attributeWithContent");
if (contentData == null) {
throw new RuntimeException("Content is null");
}
// При работе с файлами, максимальный размер которых может быть более ~20мб
// чтение контента в массив байт следует по возможности избегать. Иначе есть риск получить OutOfMemoryError
byte[] bytes = contentData.readContent(reader -> {
try {
return IOUtils.toByteArray(reader);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
Представления
Настройка отображения данных в журнале в виде списка.
Включение флага «Включить режим отображения в виде списка» добавлет поля для выбора «Атрибута с заголовком для элемента списка», «Атрибута с текстом для элемента списка».
Система добавляет в тип данных аспект listview, настройки попадают в поле config этого аспекта (можно проверить в json). При этом на вкладке аспект listview не доступен и не виден.
Можно использовать для представления списка новостей, базы знаний, перечисления товаров или оборудования.
Пример представления данных в виде списка:
Описание параметров типа
id: String |
Уникальный идентификатор типа. Не наследуется. |
name: MLText |
Имя типа. Не наследуется. |
description: MLText |
Описание типа. Не наследуется. |
storageType: String |
Тип хранилища. Не наследуется. |
sourceId: String |
Идентификатор источника данных. Вычисляется по правилам:
|
parentRef: EntityRef |
Ссылка на родительский тип. Не наследуется. |
formRef: EntityRef |
Ссылка на форму. Наследуется если значение пустое И inheritForm == true.
|
journalRef: EntityRef |
Ссылка на журнал. Не наследуется.
|
defaultStatus: String |
Статус по умолчанию. Если не задан, то наследуется от родителя. |
boardRef: EntityRef |
Ссылка на канбан доску. Не наследуется. |
dashboardType: String |
Тип дашборда. Если не задан, то наследуется от родителя. |
inheritForm: Boolean |
Флаг для включения и отключения наследования формы. Не наследуется. |
inheritActions: Boolean |
Флаг для включения и отключения наследования действий. Не наследуется. |
inheritNumTemplate: Boolean |
Флаг для включения и отключения наследования шаблона нумерации. Не наследуется. |
dispNameTemplate: MLText |
Шаблон отображаемого имени. Если не задан, то наследуется от родителя. |
numTemplateRef: EntityRef |
Шаблон нумерации. Если не задан и флаг inheritNumTemplate == true, то наследуются от родителя. |
actions: List<EntityRef> |
Действия. Если не заданы И флаг inheritActions == true, то наследуются от родителя. |
associations: List<AssocDef> |
Ассоциации. Родительские ассоциации объединяются с ассоциациями текущего типа. Если id у ассоциаций совпадает, то происходит перезапись. |
defaultCreateVariant: Boolean? |
Нужно ли генерировать вариант создания по умолчанию. Не наследуется. |
createVariants: List<CreateVariantDef> |
Варианты создания. Не наследуются. Вычисляются по правилам:
|
createVariantsForChildTypes: Boolean |
Нужно ли добавлять в варианты создания варианты создания дочерних типов. Не наследуется. |
configFormRef: EntityRef |
Форма для доп. конфига. Если не задана, то наследуется. |
config: ObjectData |
Доп. конфиг. Не наследуется |
model: TypeModelDef |
Модель. Наследуется. Ниже подробнее. |
|
Атрибуты типа. Наследуются от родителя и объединяются с атрибутами текущего типа. Если id совпадает, то происходит полное переопределение. |
|
Системные атрибуты типа. Наследуются от родителя и объединяются с системными атрибутами текущего типа. Если id совпадает, то происходит полное переопределение. |
|
Роли типа. Наследуются от родителя и объединяются с ролями текущего типа. Если id совпадает, то происходит полное переопределение. |
|
Статусы типа. Наследуются от родителя и объединяются со статусами текущего типа. Если id совпадает, то происходит полное переопределение. |
|
Стадии типа. Не наследуются от родителя. |
docLib: DocLibDef |
Настройки библиотеки документов. Не наследуются. |
contentConfig: TypeContentConfig |
Настройка работы с контентом. Наследуется. Ниже подробнее |
|
Путь до атрибута с основным контентом документа. Если не задан, то наследуется от родителя. |
|
Путь до атрибута с основным контентом для превью. Если не задан, то наследуется от родителя. Если и в родителе он не задан, то берется значение path. |
|
Ссылка на хранилище контента. Если не задана, то берется из родителя. |
|
Конфигурация хранилища контента. Берется из родителя если storageRef не задан. |
properties |
Доп. настройки типа. Не наследуются. |
aspects |
Аспекты типа. Аспекты родителя объединяются с аспектами в текущем типе. Если поле ref у аспектов совпадает, то происходит переопределение. |
queryPermsPolicy |
Политика поиска с проверкой прав. Наследуется от родителя если текущее значение DEFAULT |
assignablePerms |
Назначаемые права. Объединяются с назначаемыми правами родительского типа. |
Отображаемое имя сущности
Есть несколько сценариев для работы с отображаемым именем сущности.
Если необходимо, чтобы имя сущности всегда формировалось по шаблону, то следует использовать поле
dispNameTemplateв типе;Если необходимо, чтобы именем сущности можно было управлять, то следует в список атрибутов добавить атрибут с id = „name“. Система автоматически будет использовать это поле для отображаемого имени (скаляр ?disp в Records API)
Можно вывести поле name на форму и тогда пользователь сможет сам им управлять
Можно поле name не выводить на форму, но позволить пользователю работать с
_contentатрибутом. В этом случае при загрузке нового контента автоматически будет изменяться поле name и => отображаемое имя.
Настройка прав для описания типов
В журнале типов для редактирования прав на конкретный тип доступна кнопка:
При нажатии на эту кнопку можно настроить права на конкретный тип:
Доступные права для редактирования:
Идентификатор |
Описание |
|---|---|
read |
Право на чтение. На данный момент не проверяется т.к. конфигурации типов доступны всем. |
write |
Право на изменение типа. |
create-children |
Право на создание дочерних типов |
Право на изменение типа имеют три категории пользователей:
Системные администраторы
Пользователи, которым выданы права write системным администратором
Создатель типа
Наследование прав
Все права по умолчанию наследуются от родительского типа к дочерним, но это поведение можно отключить если убрать флаг «Наследовать права» при настройке прав на тип.
Право на создание типа без родителя
Если при создании типа поле с родительским типом оставить пустым, то родителем у такого типа будет тип с идентификатором «base». Если нужно чтобы определенные пользователи могли создавать типы с любыми родителями, то следует выдать права «create-children» на тип «base».
Автоматически сгенерированные формы и журналы в типе данных
Для типа данных доступны автоматически генерируемая форма и журнал:
Рассмотрим подробнее на примере. Заполним атрибуты типа данных:
На форме типа после создания становятся доступны действия с автосгенерированными формой и журналом:
Журнал
Журнал получает идентификатор – type$idтипа, название - как и тип данных, и может полноценно использоваться в системе – может быть добавлен в меню:
Перейти в журнал и создать элемент журнала:
Перейдем в журнал «Журналы»:
Автосгенерированный журнал нельзя редактировать, т.к. он генерируется на лету при каждом обращении.
Для журнала доступны действия:
скачать,
редактировать json,
копировать,
открыть журнал в соседней вкладке.
По нажатию на глаз открывается дашборд для просмотра свойств сгенерированного журнала:
Изменение автосгенерированного журнала
Вариант 1
Если необходимо изменить журнал. Например, чтобы в журнале не отображалось какое-то из полей.
Для этого необходимо скопировать журнал из карточки типа данных.
Переименовать:
В типе данных проставляется данный журнал и становятся доступны действия, включая редактирование:
Нажать «Редактировать»:
Внести изменения и сохранить.
Вариант 2
Если автосгенерованный журнал уже добавлен в левое меню, то откройте журнал и нажмите на шестеренку:
Далее в окне представлены настройки:
Введите Идентификатор для нового журнала.
В Типе данных по умолчанию указан тот тип, для которого был автоматически создан журнал.
На форме настроек можно убрать все типы данных, если нет необходимости менять у них журнал по завершении создания нового артефакта.
Сохраните.
После подтверждения настроек открывается форма изменения виртуального журнала с предуказанным полем «Идентификатор журнала» (из настройки выше):
Внесите изменения и сохраните.
После сохранения происходит создание нового журнала и в выбранных типах данных автосгенерированный журнал изменяется на созданный:
Форма
Для созданного типа данных для формы доступны следующие действия:
|
Тестировать форму - как будет выглядеть форма в итоговом виде:
Для просмотра формы необходимо нажать Submit:
На форме присутствуют поля в соответствии с данными и типом, указанным в атрибутах.
|
|
Автосгенерированную форму можно скопировать, чтобы присвоить идентификатор и отредактировать под себя. См. подробнее ниже
|
Перейдем в журнал «Формы».
Форма получает идентификатор – type$idтипа, название - как у типа данных.
Автосгенерированную форму нельзя редактировать.
Для формы доступны действия:
тестировать форму,
скачать,
редактировать json,
копировать,
открыть форму в соседней вкладке.
По нажатию на глаз открывается дашборд для просмотра свойств сгенерированной формы:
Изменение автосгенерированной формы
Вариант 1
Если необходимо изменить форму. Например, чтобы в форме инициатор выбирался автоматически как текущий пользователь.
Для этого необходимо скопировать формуиз карточки типа данных.
Переименовать:
В типе данных проставляется данная форма и становятся доступны действия, включая редактирование:
Нажать «Редактировать»:
Далее перейти к редактированию компонента:
На вкладке «Кастомные» выставить чекбокс «Текущий пользователь по умолчанию», сохранить компонент:
Далее сохранить форму, тип данных.
В журнале «Формы» при этом пропадет автосгенерированная форма, т.к. она не выбрана по умолчанию в типе данных.
И добавлена созданная вручную, для которой доступны и редактирование, и удаление:
Проверим – при создании заявления на отпуск инициатором автоматически проставляется текущий пользователь:
Вариант 2
Если автосгенерованный журнал уже добавлен в левое меню, то откройте журнал, нажмите +, и далее на открывшейся форме нажмите на шестеренку:
Далее в окне представлены настройки:
Введите Идентификатор для новой формы.
В Типе данных по умолчанию указан тот тип, для которого была автоматически создана форма.
На форме настроек можно убрать все типы данных, если нет необходимости менять у них форму по завершении создания нового артефакта.
Сохраните.
После подтверждения настроек открывается форма изменения виртуальной формы с предуказанным полем «ID формы» (из настройки выше):
Внесите изменения и сохраните.
После сохранения происходит создание новой формы и в выбранных типах данных автосгенерированная форма изменяется на созданный: