logo

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

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

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

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

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

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

1
2
3
4
using EleWise.ELMA.API;
using EleWise.ELMA.Documents.Models;
using EleWise.ELMA.Model.Filters;
using EleWise.ELMA.Security;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Создаем состояние таблицы для документов
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.

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

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

1
folderIncoming.Save();