Создание и настройка отображения папок-фильтров сценарием

В данной статье рассмотрено создание и настройка отображения папок-фильтров в сценарии.

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

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.

Пространство имен:

using EleWise.ELMA.API;
using EleWise.ELMA.Documents.Models;
using EleWise.ELMA.Model.Filters;
using EleWise.ELMA.Security;

Текст сценария:

var admin = PublicAPI.Portal.Security.User.Load(SecurityConstants.AdminUserUid);	
            var folderOffice = PublicAPI.Docflow.Folder.LoadOrNull(DocflowConstants.FolderOffice);	
            var folderIncoming = PublicAPI.Docflow.Objects.Folders.FilterDocumentFolder.Create();	
            folderIncoming.CreationAuthor = admin;	
            folderIncoming.Folder = folderOffice;	
            folderIncoming.Name = SR.T("Мои входящие");	
            folderIncoming.ImageUrl = "/Content/Images/x16/in.png";	
            folderIncoming.SortTypeId = 10;	
            folderIncoming.SearchOnOpen = true;	
            folderIncoming.Virtual = true;	
             	
            PublicAPI.Docflow.Permissions.AddViewPermission(folderIncoming, admin);	
            PublicAPI.Docflow.Permissions.AddEditPermission(folderIncoming, admin);	
            PublicAPI.Docflow.Permissions.AddManageAccessPermission(folderIncoming, admin);	
            PublicAPI.Docflow.Permissions.AddFullAccessPermission(folderIncoming, admin);	
             	
            var documentFilter = PublicAPI.Docflow.Document.Filter().RegistrationCard(c => c.Flow(PublicAPI.Enums.Documents.DocumentFlowType.Incoming).Status(PublicAPI.Enums.Documents.RegistrationCardStatus.Register)).Filter;	
            folderIncoming.DocumentFilter = UniversalFilterSaver.Pack(documentFilter);	
            folderIncoming.FilterColumnState = new List<string> { "Name", "CreationAuthor" };	
            folderIncoming.Save();	

Пример сценария без использования PublicAPI

Текст сценария:

var admin = UserManager.Instance.Load(SecurityConstants.AdminUserUid);
var folderOffice = FolderManager.Instance.LoadOrNull(DocflowConstants.FolderOffice);
var folderIncoming = new InstanceOf<IFilterDocumentFolder>
                {
                    New =
                    {
                        CreationAuthor = admin,                        
                        Folder = folderOffice,
                        Name = SR.T("Мои входящие"),
                        ImageUrl = "/Content/Images/x16/in.png",
                        SortTypeId = 10,
                        SearchOnOpen = true,
                        Virtual = true
                    }
                }.New;
folderIncoming.Permissions.Add(new InstanceOf<IDmsObjectPermission>
                {
                    New =
                    {
                        DmsObject = folderIncoming,
                        PermissionId = EleWise.ELMA.Documents.PermissionProvider.DocumentViewPermission.Id,
                        TypeRoleId = CommonRoleTypes.User.Id,
                        User = admin
                    }
                }.New);
  
 folderIncoming.Permissions.Add(new InstanceOf<IDmsObjectPermission>
                {
                    New =
                    {
                        DmsObject = folderIncoming,
                        PermissionId = EleWise.ELMA.Documents.PermissionProvider.DocumentEditPermission.Id,
                        TypeRoleId = CommonRoleTypes.User.Id,
                        User = admin
                    }
                }.New);
 folderIncoming.Permissions.Add(new InstanceOf<IDmsObjectPermission>
                {
                    New  = 
                     {
                    	DmsObject = folderIncoming,
                        PermissionId = EleWise.ELMA.Documents.PermissionProvider.DocumentManagerAccessPermission.Id, 
                        TypeRoleId = CommonRoleTypes.User.Id,
                        User = admin
                     }
                 }.New);
  
 folderIncoming.Permissions.Add(new InstanceOf<IDmsObjectPermission>
                {
                    New =
                    {
                       DmsObject = folderIncoming,
                       PermissionId = EleWise.ELMA.Documents.PermissionProvider.DocumentFullAccessPermission.Id,
                       TypeRoleId = CommonRoleTypes.User.Id,
                       User = admin
                    }
                }.New);
  
var documentFilter = (IDocumentExtFilter)InterfaceActivator.Create<IDocumentFilter>();
documentFilter.RegistrationCard = InterfaceActivator.Create<IRegistrationCardFilter>();
documentFilter.RegistrationCard.Flow = DocumentFlowType.Incoming;
documentFilter.RegistrationCard.Status = RegistrationCardStatus.Register;
folderIncoming.DocumentFilter = UniversalFilterSaver.Pack(documentFilter);
folderIncoming.Save();

Теперь скроем поле «Дата создание» (которое автоматически согласно метаданным добавляется для отображения) и добавим поле «Дата изменения» для отображения. Для этого нужно модифицировать свойство папки-фильтра GridState. Подробнее о состоянии таблицы читайте перейдя по ссылке: https://www.elma-bpm.ru/kb/article-482.html.

//Создаем состояние таблицы для документов
var gridState = GridState.CreateNew("MoiVhodishie", typeof(IDocument));
//Грузим описание типа документа
var documentMetadata = (EntityMetadata)InterfaceActivator.LoadMetadata<IDocument>();
//Ищем описание свойства Дата создания
var creationDateMetadata = documentMetadata.Properties.First(p => p.Name == "CreationDate");
 //Ищем состояние колонки Дата создания
var creationDateState = gridState.ColumnStates.FirstOrDefault(c => c.UniqueName == creationDateMetadata.UidStr);
//Скрываем колонку Дата создания
if (creationDateState != null)
     creationDateState.Hidden = true;
//Ищем описание свойства Дата изменения
var changeDateMetadata = documentMetadata.Properties.First(p => p.Name == "ChangeDate");
//Ищем состояние колонки Дата изменения
var changeDateState = gridState.ColumnStates.FirstOrDefault(c => c.UniqueName == changeDateMetadata.UidStr);
//Отображаем колонку
if (creationDateState != null)
     changeDateState.Hidden = false;
 //Записываем состояние таблицы в папку-фильтр (предварительно нужно серелизовать объект)
folderIncoming.GridState = ClassSerializationHelper.SerializeObject(gridState);

Далее зададим список колонок для расширенного поиска. Для этого в фильтре есть свойство FilterColumnState.

folderIncoming.FilterColumnState = new List<string> { "Name", "CreationAuthor" };

После всех манипуляций сохраняем нашу папку-фильтр в БД.

folderIncoming.Save();