Описание клиентского SDK для создания модулей расширения к продуктам:
Для создания расширений рекомендуется использовать Visual Studio 2019 или выше.
Система расширений Pilot основана на стандартном механизме расширений приложений .NET — Managed Extensibility Framework (MEF). Чтобы создать новое расширение для системы Pilot выполните следующие действия:
.ext2 Например WPFExtension.ext2Assembly Information... и заполните необходимые поля.Обязательно заполните поля Title, Product и Assembly version. Т.к. клиент при загрузке вашего расширения будет искать информацию именно в этих полях.
Для удобства отладки проекта расширения выполните следующие шаги:
C:\Users\<current_user>\AppData\Local\ASCON\Pilot-ICE Enterprise\DevelopmentC:\Program Files\ASCON\Pilot-ICE Enterprise\Ascon.Pilot.PilotEnterprise.exeПапка Development по умолчанию отсутствует. Ее необходимо создать.
При разработке множества разных расширений для удобства каждое расширение можно поместить в отдельную папку. Например, для расширения
WPFExtensionможно создать папку:C:\Users\<current_user>\AppData\Local\ASCON\Pilot-ICE Enterprise\Development\WPFExtension\.
Также вместо устарешего Packages.config, рекомендуется использовать PackageReference формат управления зависимостями nuget пакетов. Для этого перед созданием проекта, убедитесь, что в настройке Visual Studio Tools>Options>NuGet Package Manager>General>Default package management format выбрано значение PackageReference.
Для миграции уже созданных проектов в контестном меню файла Packages.config выберете команду Migrate from packages.config to PackageReference.
Для подключения SDK Pilot к проекту расширения можно воспользоваться встроенным в Visual Studio механизмом распространения пакетов — NuGet Packages Manager. Для того, чтобы подключить SDK с помощью Nuget Package Manager выполните следующие шаги:
Выполните команду:
Install-Package Ascon.Pilot.SDK
Щёлкните правой кнопкой мыши на проекте и вызовите команду Manage NuGet Packages;
Для того, чтобы подключить SDK вручную выполните следующие шаги:
1. Интерфейсы для встраивания в UI
2. Интерфейсы для перехвата событий клиентского приложения
3. Интерфейсы для скриптов автоматизации
4. Интерфейсы управления данными
7. Интерфейсы для работы с конфигурацией
8. Управление общими настройками
10. Команды расширений (устаревший, использовать IPilotServiceProvider)
12. Интерфейсы для работы с шаблонами
13. Интерфейсы для реализации подписания документов сторонними криптоалгоритмами
15. Интерфейсы и данные для работы с календарём рабочих дней
Для того, чтобы встроить расширение в новую вкладку главного окна клиента Pilot необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK INewTabPage. Обязательно пометить класс, реализующий интерфейс INewTabPage, атрибутом [Export]
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace WpfExtension
{
[Export(typeof(INewTabPage))]
public class MainModule : INewTabPage
{
public void BuildNewTabPage(INewTabPageHost host)
{
}
public void OnButtonClick(string name)
{
}
}
}
INewTabPage.BuildNewTabPageМетод вызывается перед тем, как будет построена вкладка Новая вкладка.
void INewTabPage.BuildNewTabPage(INewTabPageHost host);
где:
host - интерфейс, позволяющий добавлять кнопки.Интерфейс содержит методы для добавления кнопок и групп на главную страницу Pilot: Метод SetGroup создаёт или обновляет группу кнопок с указанным заголовком
void INewTabPageHost.SetGroup(string title, Guid groupId)
где:
title локализованный заголовок группыgroupId идентификатор группы для использования в методе AddButtonToGroupМетод AddButtonToGroup служит для добавления кнопки в ранее созданную группу
void INewTabPageHost.AddButtonToGroup(string title, string name, string toolTip, byte[] svgIcon, Guid groupId);
где:
title - локализованное название кнопки;name - уникальное имя кнопки в пределах расширения;toolTip - локализованная подсказка, расположенная под названием кнопки;svgIcon - массив байт SVG иконки. Клиент поддерживает иконки только в svg формате.groupId - идентификатор группы кнопок.Метод AddButton используется для добавления кнопки в группу по умолчанию, имеющую название “Модули расширения”. Обеспечивает обратную совместимость.
void INewTabPageHost.AddButton(string title, string name, string toolTip, byte[] svgIcon);
где:
title - локализованное название кнопки;name - уникальное имя кнопки в пределах расширения;toolTip - локализованная подсказка, расположенная под названием кнопки;svgIcon - массив байт SVG иконки. Клиент поддерживает иконки только в svg формате.NewTabPage.OnButtonClickМетод вызывается при нажатии на кнопку, созданную расширением в методе BuildNewTabPage.
void INewTabPage.OnButtonClick(string name);
где:
name - уникальное имя кнопки, по которой произошло нажатие.IToolbar<TToolbarContext>Интерфейс позволяет встраивать новые команды в панель инструментов. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IToolbar<TToolbarContext> и обязательно пометить класс, реализующий интерфейс IToolbar< TToolbarContext>, атрибутом [Export].
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ContextMenuSample
{
[Export(typeof(IToolbar<TasksViewContext2>))]
public class ToolbarSample : IToolbar<TasksViewContext2>
{
public void Build(IToolbarBuilder builder, TasksViewContext2 context)
{
//...
}
public void OnToolbarItemClick(string name, TasksViewContext2 context)
{
//...
}
}
}
Чтобы встроить новые команды в панель инструментов вкладки Задания, необходимо реализовать интерфейc IToolbar<TasksViewContext2>.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ContextMenuSample
{
[Export(typeof(IToolbar<TasksViewContext2>))]
public class ToolbarSample : IToolbar<TasksViewContext2>
{
...
}
}
Чтобы встроить новые команды в панель инструментов Обозревателя документов, необходимо реализовать интерфейc IToolbar<ObjectsViewContext>
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ContextMenuSample
{
[Export(typeof(IToolbar<ObjectsViewContext>))]
public class ToolbarSample : IToolbar<ObjectsViewContext>
{
...
}
}
IToolbar<TToolbarContext>.BuildМетод вызывается перед построением панели инструментов.
void IToolbar<TToolbarContext>.Build(IToolbarBuilder builder, TToolbarContext context);
где:
builder - интерфейс, позволяющий добавлять различные элементы в панель инструментов;context - контекст, позволяющий получить дополнительные сведения о селектированных элементах.IToolbar<TToolbarContext>.OnToolbarItemClickМетод вызывается при нажатии на элемент панели инструментов.
void IToolbar<TToolbarContext>.OnToolbarItemClick(string name, TToolbarContext context);
где:
name - уникальное внутреннее имя элемента панели инструментов;context - контекст выполнения комманды.IToolbarBuilderИнтерфейс позволяет управлять элементами панели инструментов.
IToolbarBuilder.ItemNamesСвойство возвращает список уникальных имен элементов панели инструментов.
IEnumerable<string> IToolbarBuilder.ItemNames { get; }
IToolbarBuilder.CountСвойство возвращает количество элементов панели инструментов.
int IToolbarBuilder.Count { get; }
IToolbarBuilder.AddSeparatorМетод позволяет добавить разделитель в панель инструментов.
void IToolbarBuilder.AddSeparator(int index);
где:
index - индекс, куда вставить разделитель.IToolbarBuilder.AddButtonItemМетод позволяет добавить кнопку в панель инструментов.
IToolbarButtonItemBuilder AddButtonItem(string name, int index);
где:
name - уникальное внутреннее имя кнопки;index - индекс, куда вставить кнопку.Возвращает интерфейс добавления свойств кнопки IToolbarButtonItemBuilder.
IToolbarBuilder.AddMenuButtonItemМетод позволяет добавить кнопку с выпадающим меню в панель инструментов.
IToolbarMenuButtonItemBuilder AddMenuButtonItem(string name, int index);
где:
name - уникальное внутреннее имя кнопки;index - индекс, куда вставить кнопку.Возвращает интерфейс добавления свойств кнопки IToolbarMenuButtonItemBuilder.
IToolbarBuilder.AddToggleButtonItemМетод позволяет добавить кнопку-переключатель в панель инструментов.
IToolbarToggleButtonItemBuilder AddToggleButtonItem(string name, int index);
где:
name - уникальное внутреннее имя кнопки;index - индекс, куда вставить кнопку.Возвращает интерфейс добавления свойств кнопки IToolbarToggleButtonItemBuilder.
IToolbarBuilder.ReplaceButtonItemМетод позволяет заменить любой элемент панели инструментов на кнопку.
IToolbarButtonItemBuilder ReplaceButtonItem(string name);
где:
name - уникальное внутреннее имя элемента, который будет заменен.Возвращает интерфейс добавления свойств кнопки IToolbarButtonItemBuilder.
IToolbarBuilder.ReplaceMenuButtonItemМетод позволяет заменить любой элемент панели инструментов на кнопку с выпадающим меню.
IToolbarMenuButtonItemBuilder ReplaceMenuButtonItem(string name);
где:
name - уникальное внутреннее имя элемента, который будет заменен.Возвращает интерфейс добавления свойств кнопки IToolbarMenuButtonItemBuilder.
IToolbarBuilder.HandleMenuButtonItemSubmenuМетод позволяет добавить обработчик построения подменю. Прямой доступ к элементам подменю невозможно получить в произвольный момент времени, так как подменю строится “лениво” при его открытии.
void HandleMenuButtonItemSubmenu(string name, IToolbarItemSubmenuHandler itemSubmenuHandler);
где:
name - имя элемента меню, в который будет встраиваться обработчик;itemSubmenuHandler - обработчик построения подменю (реализуется на стороне модуля расширения).IToolbarBuilder.ReplaceToggleButtonItemМетод позволяет заменить любой элемент панели инструментов на кнопку-переключатель.
IToolbarToggleButtonItemBuilder ReplaceToggleButtonItem(string name);
где:
name - уникальное внутреннее имя элемента, который будет заменен.Возвращает интерфейс добавления свойств кнопки IToolbarToggleButtonItemBuilder.
IToolbarBuilder.RemoveItemМетод позволяет удалить элемент панели инструментов.
void RemoveItem(string name);
где:
name - уникальное внутреннее имя.IToolbarButtonItemBuilderИнтерфейс позволяет добавить свойства к элементу панели инструменотов.
IToolbarButtonItemBuilder.WithHeaderМетод позволяет добавить отображаемое в UI название.
IToolbarButtonItemBuilder WithHeader(string header);
где:
header - отображаемое в UI название элемента.IToolbarButtonItemBuilder.WithIconМетод позволяет добавить иконку элементу панели инструментов. Обратите внимание, иконка должна быть в формате SVG
IToolbarButtonItemBuilder WithIcon(byte[] svgIcon);
где:
svgIcon - иконка в формате SVG.IToolbarButtonItemBuilder.WithIsEnabledМетод позволяет задать значение доступности элемента.
IToolbarButtonItemBuilder WithIsEnabled(bool value);
IToolbarButtonItemBuilder.WithShowHeaderМетод позваляет спрятать или показать заголовок элемента. Чтобы показать элемент только в виде иконки необходимо в метод WithShowHeader передать параметр false
IToolbarButtonItemBuilder WithShowHeader(bool value);
IToolbarButtonItemBuilder.WithHintМетод позволяет добавить подсказку к элементу панели инструментов.
IToolbarButtonItemBuilder WithHint(string hint);
где:
hint - текст подсказки.IToolbarToggleButtonItemBuilderИнтерфейс позволяет добавить свойства к кнопке-переключателю панели инструменотов. Этот интерфейс является наследником IToolbarButtonItemBuilder.
IToolbarToggleButtonItemBuilder.WithIsCheckedМетод позволяет задать состояние кнопки-переключателя.
IToolbarToggleButtonItemBuilder WithIsChecked(bool value);
IToolbarMenuButtonItemBuilderИнтерфейс позволяет добавить свойства к кнопке с выпадающим меню панели инструменотов. Этот интерфейс является наследником IToolbarButtonItemBuilder.
IToolbarMenuButtonItemBuilder.WithMenuМетод позволяет добавить контекстное меню к кнопке.
IToolbarMenuButtonItemBuilder WithMenu(IToolbarItemSubmenuHandler itemSubmenuHandler);
где:
itemSubmenuHandler - класс, описывающий построение выпадающего меню.IToolbarItemSubmenuHandlerИнтерфейс построения меню для кнопки панели инструментов. В пакет SDK уже поставляется класс, реализующий данный интерфейс - ToolbarItemSubmenuHandler. Для того, чтобы построить меню, необходимо унаследоваться от этого класса.
IToolbarItemSubmenuHandler.OnSubmenuRequestedМетод вызывается перед тем как появится меню у кнопки панели инструментов.
void OnSubmenuRequested(IToolbarBuilder builder);
где:
builder - интерфейс построения меню.Пример построения меню для кнопки в панели инструментов:
[Export(typeof(IToolbar<TasksViewContext2>))]
public class ToolbarSample : IToolbar<TasksViewContext2>
{
public void Build(IToolbarBuilder builder, TasksViewContext2 context)
{
builder.AddMenuButtonItem("tbsMenuButton", 0)
.WithMenu(new MenuHandler())
.WithHeader("Menu button")
.WithHint("Menu button");
}
public void OnToolbarItemClick(string name, TasksViewContext2 context)
{
if (name == "MenuName")
{
//do somethig
}
}
}
public class MenuHandler : ToolbarItemSubmenuHandler
{
public override void OnSubmenuRequested(IToolbarBuilder builder)
{
builder.AddButtonItem("MenuName", 0).WithHeader("item");
}
}
Подробнее можно посмотреть в примере Ascon.Pilot.SDK.ToolbarSample, поставляемом вместе с пакетом SDK.
IMenu<TMenuContext>Интерфейс позволяет встраивать новые команды в различные меню приложения в зависимости от контекста. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IMenu<TMenuContext> и обязательно пометить класс, реализующий интерфейс IMenu< TMenuContext >, атрибутом [Export].
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ContextMenuSample
{
[Export(typeof(IMenu<TasksViewContext2>))]
public class ToolbarSample : IMenu<TasksViewContext2>
{
public void Build(IMenuBuilder builder, TasksViewContext2 context)
{
//...
}
public void OnMenuItemClick(string name, TasksViewContext2 context)
{
//...
}
}
}
Чтобы встроить новые команды в контекстное меню вкладки Задания, необходимо реализовать интерфейc IMenu<TasksViewContext2>.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ContextMenuSample
{
[Export(typeof(IMenu<TasksViewContext2>))]
public class TasksContextMenuSample : IMenu<TasksViewContext2>
{
...
}
}
Чтобы встроить новые команды в контекстное меню Обозревателя документов, необходимо реализовать интерфейc IMenu<ObjectsViewContext>
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ContextMenuSample
{
[Export(typeof(IMenu<ObjectsViewContext>))]
public class ObjectsContextMenuSample : IMenu<ObjectsViewContext>
{
...
}
}
IMenu<TMenuContext>.BuildМетод вызывается перед построением контекстного меню.
void IMenu<TMenuContext>.Build(IMenuBuilder builder, TMenuContext context);
где:
builder - интерфейс, позволяющий добавлять различные элементы в меню;context - контекст, позволяющий получить дополнительные сведения о селектированных элементах.IMenu<TMenuContext>.OnMenuItemClickМетод вызывается при нажатии на элемент меню.
void IMenu<TMenuContext>.OnMenuItemClick(string name, TMenuContext context);
где:
name - уникальное внутреннее имя элемента меню;context - контекст выполнения комманды.IMenuBuilderИнтерфейс позволяет управлять элементами меню.
IMenuBuilder.ItemNamesСвойство возвращает список уникальных имен элементов меню.
IEnumerable<string> IMenuBuilder.ItemNames { get; }
IMenuBuilder.CountСвойство возвращает количество элементов меню.
int IMenuBuilder.Count { get; }
IMenuBuilder.AddSeparatorМетод позволяет добавить разделитель в меню.
void IMenuBuilder.AddSeparator(int index);
где:
index - индекс, куда вставить разделитель.IMenuBuilder.AddItemМетод позволяет добавить пункт меню.
IMenuItemBuilder AddItem(string name, int index);
где:
name - уникальное внутреннее имя пункта меню;index - индекс, куда вставить пункт меню.Возвращает интерфейс добавления свойств пункта меню IMenuItemBuilder.
ImenuBuilder.AddCheckableItemМетод позволяет добавить пункт меню типа кнопка-переключатель.
ICheckableMenuItemBuilder AddCheckableItem(string name, int index);
где:
name - уникальное внутреннее имя пункта меню;index - индекс, куда вставить пункт меню.Возвращает интерфейс установки состояния кнопки-переключателя.
IMenuBuilder.ReplaceItemМетод позволяет заменить любой пункт меню.
IMenuItemBuilder ReplaceItem(string name);
где:
name - уникальное внутреннее имя;IMenuBuilder.RemoveItemМетод позволяет удалить пункт меню.
void RemoveItem(string name);
где:
name - уникальное внутреннее имя.IMenuBuilder.GetItemМетод позволяет получить построитель пункта меню.
IMenuBuilder GetItem(string name);
где:
name - уникальное внутреннее имя;Возвращает интерфейс добавления пунктов меню IMenuBuilder.
IMenuItemBuilderИнтерфейс позволяет добавлять свойства пункту меню.
IMenuItemBuilder.WithHeaderМетод позволяет добавить отображаемое в UI название.
IMenuItemBuilder WithHeader(string header);
где:
header - отображаемое в UI название пункта меню.IMenuItemBuilder.WithIconМетод позволяет добавить иконку. Обратите внимание, иконка должна быть в формате SVG для всех меню кроме IMenu<StorageContext>. Иконки для меню Pilot-Storage дожны быть в формате PNG.
IMenuItemBuilder WithIcon(byte[] icon);
где:
icon - иконка.IMenuItemBuilder.WithIsEnabledМетод позволяет задать значение доступности элемента.
IMenuItemBuilder WithIsEnabled(bool value);
IMenuItemBuilder.WithSubmenuМетод позволяет добавить подменю к текущему пункту меню.
IMenuBuilder WithSubmenu();
IHotKey<THotKeyContext>Интерфейс позволяет назначать горячие клавиши частей приложения в зависимости от контекста. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IHotKey<THotKeyContext> и обязательно пометить класс, реализующий интерфейс IHotKey<THotKeyContext> атрибутом [Export]. Чтобы назначить горячие клавиши, которые будут активны в Обозревателя документов, необходимо реализовать интерфейc IHotKey<ObjectsViewContext>. На данный момент это единственный тип контекста, который поддерживает добавление горячих клавиш.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ExtensionHotKeySample
{
[Export(typeof(IHotKey<ObjectsViewContext>))]
public class HotKeySample : IHotKey<ObjectsViewContext>
{
public void AssignHotKeys(IHotKeyCollection hotKeyCollection)
{
//...
}
public void OnHotKeyPressed(string commandId, ObjectsViewContext context)
{
//...
}
}
}
IHotKey<THotKeyContext>.AssignHotKeysМетод AssignHotKeys вызывается при загрузке интерфейса, который соответсвует указанному контексту. Например, метод расширения для контекста ObjectsViewContext будет вызван при открытии вкладки с Обозревателем документов.
void IHotKey<THotKeyContext>.AssignHotKeys(IHotKeyCollection hotKeyCollection);
где:
hotKeyCollection - интерфейс коллекции горячих клавиш, который непосредственно добавляет горячие клавиши в интерфейс приложения;IHotKey<THotKeyContext>.OnHotKeyPressedМетод вызывается, когда была нажата одна из комбинаций горячих клавиш, добавленных с помощью расширения.
void IHotKey<THotKeyContext>.OnHotKeyPressed(string commandId, ObjectsViewContext context);
где:
commandId - уникальный идентификатор команды, который должен быть задан при добавлении горячей клавиши в методе AssignHotKeys;context - контекст, в котором горячая клавиша была нажата.IHotKeyCollectionИнтерфейс коллекции для добавления горячих клавиш.
IHotKeyCollection.AddМетод позволяет добавить разделитель новую горячую клавишу. Если для данного контектса уже была задана такая же горячая клавиша, добавление новой перезапишет ранее добавленную команду. Таким образом, можно переопределить поведение стандартных горячих клавиш в используемом контексте.
void IMenuBuilder.Add(Key key, ModifierKeys modifierKeys, string commandId;
где:
key - горячая клавиша;modifierKeys - модификатор корячей клавиши, позволяющий задать сочетания горячих клавиш с Ctrl, Alt и Shift;commandId - уникальный идентификатор команды, который используется в методе OnHotKeyPressed для определения того, какую команду нежно выполнить; Чтобы встроить расширение в контекстное меню или панель инструментов вкладки Задания, используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<TasksViewContext2>))]
public class ContextMenuSample : IMenu<TasksViewContext2>
{
...
}
}
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IToolbar<TasksViewContext2>))]
public class ToolbarSample : IToolbar<TasksViewContext2>
{
...
}
}
Чтобы встроить расширение в контекстное меню или панель инструментов Обозревателя проектов, используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<ObjectsViewContext>))]
public class ContextMenuSample : IMenu<ObjectsViewContext>
{
...
}
}
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IToolbar<ObjectsViewContext>))]
public class ToolbarSample : IToolbar<ObjectsViewContext>
{
...
}
}
Чтобы встроить расширение в главное меню приложения используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<MainViewContext>))]
public class MenuSample : IMenu<MainViewContext>
{
...
}
}
Чтобы встроить расширение в системное меню, используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<SystemTrayContext>))]
public class MenuSample : IMenu<SystemTrayContext>
{
...
}
}
Чтобы встроить расширение в контекстное меню Pilot-Storage, используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<StorageContext>))]
public class MenuSample : IMenu<StorageContext>
{
...
}
}
Используйте этот тип контекста, чтобы встроить расширение в панель инструментов и контекстное меню списка замечаний к документу:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IToolbar<DocumentAnnotationsListContext>))]
public class DocumentAnnotationsListToolbarSample : IToolbar<DocumentAnnotationsListContext>
{
...
}
[Export(typeof(IMenu<DocumentAnnotationsListContext>))]
public class DocumentAnnotationsListContextMenuSample : IMenu<DocumentAnnotationsListContext>
{
...
}
}
Чтобы встроить расширение в панель инструментов компоновщика XPS, используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IToolbar<XpsMergerContext>))]
public class XpsMergerToolbarSample : IToolbar<XpsMergerContext>
{
...
}
}
XpsRenderContext содержит информацию об открытом в просмотрщике документе. Чтобы встроить расширение в панель инструментов просмотрщика документов, используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IToolbar<XpsRenderContext>))]
public class XpsRenderToolbarSample : IToolbar<XpsRenderContext>
{
...
}
}
XpsRenderClickPointContext содержит информацию об открытом в просмотрщике документе и о точке вызова контестного меню, а именно о координатах и номере страницы. Чтобы встроить расширение в контестное меню просмотрщика документов, используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<XpsRenderClickPointContext>))]
public class XpsRenderContextMenuSample : IMenu<XpsRenderClickPointContext>
{
...
}
}
Графический слой позволяет встраивать через SDK растровые изображения и блоки XAML разметки в XPS документ (см. Ascon.Pilot.SDK.GraphicLayerSample). Добавленные элементы графического слоя можно перемещать по документу и вызывать контекстное меню с командами, добавленными из плагина. Графический слой не является частью XPS документа и доступен для просмотра только в Pilot. Элементы графического слоя, помеченные как IsFloating = false, вшиваются в XPS документ во время печати или при создании запроса на подпись. Чтобы получить XPS с вшитым графическим слоем, необходимо отправить документ на печать в виртуальный принтер Pilot XPS или создать запросы на подпись. После этого элементы графического слоя будет невозможно перемещать по документу, вызывать контекстное меню и менять содержимое через плагин. Чтобы встроить расширение в контекстное меню графического элемента используйте этот тип контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<GraphicLayerElementContext>))]
public class GraphicLayerContextMenuSample : IMenu<GraphicLayerElementContext>
{
...
}
}
Чтобы встроить расширение в контекстное меню панели файлов ECM, документа используйте данный вид контекста. Описание свойств контекста:
IEnumerable<IDataObject> EcmDocument { get; } - ECM документ, для которого была показана панель файловIEnumerable<IStorageDataObject> SelectedObjects { get; } - список выбранных файловbool IsContext { get; } - флаг, показывающий, в каком месте был сделан вызов менюbool IsMounted { get; } - флаг, определяющий, был ли смонтирован на Pilot-Storage ECM документ в момент вызова менюDocumentFilesUsage Usage { get; } - определяет, в каком UI используется панель файлов
Перечисление UI использующих панель файлов
UI создания нового ECM документа
UI обозревателя документов
UI карточки документа
UI менеджера шаблонов документов
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<DocumentFilesContext>))]
public class MenuSample : IMenu<DocumentFilesContext>
{
...
}
}
Чтобы встроить расширение в контекстное меню связанных заданий, используйте данный вид контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<LinkedTasksContext2>))]
public class MenuSample : IMenu<LinkedTasksContext2>
{
...
}
}
Чтобы встроить расширение в контекстное меню панели запросов на подпись документа, используйте данный вид контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<SignatureRequestsContext>))]
public class MenuSample : IMenu<SignatureRequestsContext>
{
...
}
}
Чтобы встроить расширение в контекстное меню менеджера вложений (например, вложений в задание), используйте данный вид контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<AttachmentManagerContext>))]
public class MenuSample : IMenu<AttachmentManagerContext>
{
...
}
}
Чтобы встроить расширение в контекстное меню вкладки Связи, используйте данный вид контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<LinkedObjectsContext>))]
public class MenuSample : IMenu<LinkedObjectsContext>
{
...
}
}
Используйте реализацию интерфейса IMenu для этого типа контекста, чтобы дать возможность вашему расширению встраиваться в контекстное меню списка шаблонов заданий:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<TasksTemplatesViewContext>))]
public class MenuSample : IMenu<TasksTemplatesViewContext>
{
...
}
}
Чтобы встроить расширение в контекстное меню объекта на вкладке Календарь рабочих дней, используйте данный вид контекста:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IMenu<CalendarObjectsViewContext>))]
public class MenuSample : IMenu<CalendarObjectsViewContext>
{
...
}
}
ITabsExtension<TTabsContext>Интерфейс для добавления новых вкладок в различные места приложения, использующие коллекции вкладок для отображения определенного контекста. Для создания расширения, добавляющего новые вкладки в коллекцию, необходимо реализовать в расширении интерфейс Ascon.Pilot.SDK ITabsExtension<TTabsContext> и обязательно пометить класс, реализующий интерфейс ITabsExtension<TTabsContext>, атрибутом [Export].
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace DocumentExplorerTabsSample
{
[Export(typeof(ITabsExtension<DocumentExplorerDetailsTabsContext>))]
public class DocumentExplorerTabsSample : ITabsExtension<DocumentExplorerDetailsTabsContext>
{
public void BuildTabs(ITabsBuilder builder, DocumentExplorerDetailsTabsContext context)
{
//Put new tabs building logic here...
}
public void OnIsActiveChanged(Guid tabId, bool isActive)
{
//Put tabs activation and deactivation logic here...
}
public void OnDisposed(Guid tabId, bool isActive)
{
//Put disposing and clearing tabs logic here to free resources when associated tabs collection is no longer displayed...
}
}
}
Чтобы добавить новые вкладки в коллекцию вкладок связанных элементов Обозревателя документов, необходимо реализовать в расширении интерфейс ITabsExtension<DocumentExplorerDetailsTabsContext>.
namespace DocumentExplorerTabsSample
{
[Export(typeof(ITabsExtension<DocumentExplorerDetailsTabsContext>))]
public class DocumentExplorerTabsSample : ITabsExtension<DocumentExplorerDetailsTabsContext>
{
...
}
}
ITabsExtension<TTabsContext>.BuildTabsМетод BuildTabs вызывается при построении коллекции вкладок и позволяет добавить в коллекцию новые вкладки.
void ITabsExtension<TTabsContext>.BuildTabs(ITabsBuilder builder, TTabsContext context);
где:
builder - интерфейс построителя вкладок, который непосредственно позволяет добавить новые вкладки;context - контекст коллекции вкладок, который позволяет получить информацию о том, для каких элементов строится коллекция вкладок.ITabsExtension<TTabsContext>.OnIsActiveChangedМетод вызывается при изменении активности вкладки, которая была добавлена с помощью расширения.
void ITabsExtension<TTabsContext>.OnIsActiveChanged(Guid tabId, bool isActive);
где:
tabId - уникальный идентификатор вкладки;isActive - флаг, указывающий новое состояние вкладки.ITabsExtension<TTabsContext>.OnDisposedМетод вызывается при очистке коллекции вкладок, в которую были добавлены вкладки расширений. Например, перед перестроением вкладок при смене их контекста или при закрытии пользователем окна, содержащего коллекцию вкладок. Метод позволяет отменить длительные операции или освободить ресурсы, принадлежащие вкладкам расширения, которые больше не будут использоваться.
void ITabsExtension<TTabsContext>.OnDisposed(Guid tabId);
где:
tabId - уникальный идентификатор вкладки;ITabsBuilderИнтерфейс построителя вкладок расширения, передается в качестве аргумента метода BuildTabs и позволяет добавить новые вкладки в коллекцию.
ITabsBuilder.AddTabМетод, добавляющий новую вкладку. Обратите внимание, что в коллекцию вкладок может быть добавлено более одной вкладки расширения. Для того, чтобы корректно обрабатывать события изменения активности вкладки и освобождения её ресурсов, при добавлении новой вкладки расширение должно назначить ей уникальный идентификатор, и впоследствии отличать эту вкладку с помощью этого идентификатора. Для примера работы с идентификаторами вкладок обратитесь к примеру Ascon.Pilot.SDK.TabsExtensionSample.
void ITabsExtension<TTabsContext>.AddTab(Guid id, string title, FrameworkElement view);
где:
tabId - уникальный идентификатор вкладки, который должен быть сгенерирован расширением и впоследствии использован для идентификации вкладок при вызове методов OnIsActiveChanged и OnDisposed; title - заголовок вкладки;view - контент, который будет отображаться в качестве содержимого вкладки.Класс, описывающий контекст вкладок области связей Обозревателя документов. Расширение должно использовать этот тип контекста, чтобы добавить свои вкладки эту область (в дополнение к стандартным вкладкам ЗАДАНИЯ, СВЗЯИ и ЧАТ):
public class DocumentExplorerTabsExtension : ITabsExtension<DocumentExplorerDetailsTabsContext>
{
...
}
DocumentExplorerDetailsTabsContext.SelectedObjectСвойство, которое возвращает выбранный в данный момент элемент в Обозревателе документов, для которого строится коллекция вкладок.
public IDataObject SelectedObject { get; }
DocumentExplorerDetailsTabsContext.SnapshotDateTimeСвойство, которое возвращает время создания выбранной версии документа, выбранного в Обозревателе документов. Возвращает null, если выбрана актуальная версия документа.
public DateTime? SnapshotDateTime { get; }
Для того, чтобы заменить стандартную карточку элемента в Обозревателе проектов предусмотрен интерфейс IDocumentsExplorerDetailsViewProvide
Интерфейс позволяет заменить карточку элемента в Обозревателе проектов на свою собственную. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IDocumentsExplorerDetailsViewProvider и обязательно пометить класс, реализующий интерфейс IDocumentsExplorerDetailsViewProvider атрибутом [Export]
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ContextMenuSample
{
[Export(typeof(IDocumentsExplorerDetailsViewProvider))]
public class DetailsViewProvider : IDocumentsExplorerDetailsViewProvider
{
...
}
}
FrameworkElement GetDetailsView(ObjectsViewContext context);
Метод должен возвращать UI елемент, который будет отображаться у выбранного элемента в Обозревателе проектов.
IType Type { get; }
Свойство должно возвращать тип элемента, для которого будет показываться UI елемент.
[Export(typeof(IDocumentsExplorerDetailsViewProvider))]
public class DetailsViewProvider : IDocumentsExplorerDetailsViewProvider
{
[ImportingConstructor]
public DetailsViewProvider(IObjectsRepository repository)
{
Type = repository.GetType("section");
}
public FrameworkElement GetDetailsView(ObjectsViewContext context)
{
var obj = context.SelectedObjects.FirstOrDefault();
if (obj == null)
return null;
var viewModel = new TypeDetailsViewModel(obj.Type);
var view = new TypeDetailsView
{
DataContext = viewModel
};
return view;
}
public IType Type { get; }
}
Для того, чтобы добавить новую опцию очистки кэша в диалог Управление кэшем предусмотрен интерфейс IClearCache
Интерфейс позволяет добавить новую опцию очистки кэша в диалог Управление кэшем. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IClearCache и обязательно пометить класс, реализующий интерфейс IClearCache атрибутом [Export]
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ClearCacheSample
{
[Export(typeof(IClearCache))]
public class ClearCacheProcedure : IClearCache
{
...
}
}
string Title { get; }
Свойство должно возвращать название процедуры очистки кэша для модуля расширения, которое будет отображаться в диалоге Управление кэшем.
void GetInfo(ClearCacheInfo clearCacheInfo);
Метод должен давать информацию о количестве и общем размере файлов кэша, которые могут быть удалены в данный момент. Для этого в данном методе должны задаваться соответсвующие значения свойств объекта класса ClearCacheInfo, передаваемого как аргумент метода.
void ExecuteClearCache();
Метод должен выполнять процедуру очистки кэша для модуля расширения. Следует учитывать возможность отмены этой процедуры с помощью метода StopClearCache. Данный метод работает на специальном рабочем потоке (worker thread) и не блокирует GUI.
void StopClearCache();
Метод должен отменять выполнение метода ExecuteClearCache. Данный метод работает на UI потоке (UI thread).
event EventHandler<ClearCacheProgressChangedEventArgs> ClearCacheProgressChanged;
Событие должно оповещать об изменении прогресса при выполнеии ExecuteClearCache.
Интерфейс позволяет реализовать обработку автоимпорта документов (печать на Pilot XPS принтер, загрузка документов в папку автоимпорта). Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IAutoimportHandler и обязательно пометить класс, реализующий интерфейс IAutoimportHandler атрибутом [Export]
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace AutoimportHandlingSample
{
[Export(typeof(IAutoimportHandler))]
public class AutoimportHandlingSample : IAutoimportHandler
{
public bool Handle(string filePath, string sourceFilePath, AutoimportSource autoimportSource)
{
}
}
}
Интерфейс позволяет реализовать обработку печати документов с помощью принтера. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IPrintHandler и обязательно пометить класс, реализующий интерфейс IPrintHandler атрибутом [Export]
В слуачае перхвата печати из Компоновщика XPS, IPrintedDocumentInfo.DocumentId равно Guid.Empty, а в IPrintedDocumentInfo.PrinterSettings.PrintJobName вместо имени, для скомпонованного документа, записывается строка формата “Наименование документа#номер страницы|”. Например: MultipageXps.xps#2|1 - План на отметке 0,000 - Рабочий чертеж#1
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace PrintHandlingSample
{
[Export(typeof(IPrintHandler))]
public class PrintHandlingSample : IPrintHandler
{
public bool Handle(IPrintedDocumentInfo printTicket)
{
}
}
}
Интерфейс позволяет реализовать обработку уведомлений из диспетчера уведомлений. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK.INotificationsHandler и обязательно пометить класс, реализующий интерфейс INotificationsHandler, атрибутом [Export].
Метод Handle вызывается перед каждым показом нового уведомления. Если метод вернет true, то уведомление не будет показано в стандартном диспетчере уведомлений.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace NotificationsHandlerSample
{
[Export(typeof(INotificationsHandler))]
public class NotificationsHandler : INotificationsHandler
{
public bool Handle(INotification notification)
{
}
}
}
Интефейс INotification описывает уведомление и содержит следующие члены:
Идентификатор элемента, по которому пришло уведомление.
Guid ObjectId { get; }
Отображаемое имя элемента, по которому пришло уведомление.
string Title { get; }
Текст уведомления
string Message { get; }
Идентификатор пользователя, изменение которого привело к уведомлению. Значение null означает, что уведомление было сгенерировано серверной логикой без команды пользователя.
int? UserId { get; }
Содержит дату и время создания уведомления в формате UTC.
DateTime DateTime { get; }
Идентификатор типа элемента, по которому пришло уведомление.
int TypeId { get; }
Метод расширения, возвращающий инкрементальный идентификатор набора изменений, приведшего к созданию уведомления. Получение уведомления по элементу не гарантирует того, что обновленное состояние элемента уже было получено клиентом. Для того, чтобы получить обновленный элемент, подпишитесь на изменения по элементу и дождитесь значения IDataObject.LastChange, большего или равного ChangesetId уведомления. Пример:
[Export(typeof(IDataPlugin))]
public class Main : IDataPlugin, IObserver<INotification>
{
private readonly IObjectsRepository _repository;
[ImportingConstructor]
public Main(IObjectsRepository repository)
{
_repository = repository;
repository.SubscribeNotification(NotificationKind.StorageObjectRenamed).Subscribe(this);
}
public async void OnNext(INotification value)
{
var loader = new ObjectLoader(_repository);
var obj = await loader.Load(value.ObjectId, value.ChangesetId());
var message = string.Format("Storage object renamed to {0}", obj.DisplayName);
MessageBox.Show(message, "Ascon.Pilot.SDK.NotificationsSample");
}
public void OnError(Exception error)
{
}
public void OnCompleted()
{
}
}
public class ObjectLoader : IObserver<IDataObject>
{
private readonly IObjectsRepository _repository;
private IDisposable _subscription;
private TaskCompletionSource<IDataObject> _tcs;
private long _changesetId;
public ObjectLoader(IObjectsRepository repository)
{
_repository = repository;
}
public Task<IDataObject> Load(Guid id, long changesetId = 0)
{
_changesetId = changesetId;
_tcs = new TaskCompletionSource<IDataObject>();
_subscription = _repository.SubscribeObjects(new[] {id}).Subscribe(this);
return _tcs.Task;
}
public void OnNext(IDataObject value)
{
if (value.State != DataState.Loaded)
return;
if(value.LastChange() < _changesetId)
return;
_tcs.TrySetResult(value);
_subscription.Dispose();
}
public void OnError(Exception error) { }
public void OnCompleted() { }
}
Интерфейс позволяет реализовать работу с атрибутами, отображаемыми в карточке объекта. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK.IObjectCardHandler и обязательно пометить класс, реализующий интерфейс IObjectCardHandler, атрибутом [Export].
Метод Handle вызывается при каждом построении карточки объекта: при показе диалогов создания и редактирования объекта, при выборе объектов, для которых отображается карточка, в Обозревателе документов, а так же в диалоге автоимпорта при выборе нового родителя для создаваемого документа или селектировании документа для замены файла. В случае, если карточка находится в режиме редактирования существующего объекта, свойство EditingObject аргумента context возвращает сам объект, атрибуты которого показаны в карточке; и null, если карточка показана для создания нового объекта. Возвращаемое значение типа boolean никак не используется в реализации метода на стороне приложения Pilot и может быть любым.
Метод OnValueChanged вызывается при изменении пользователем значения какого-либо из отображаемых атрибутов в карточке объекта. Аргумент sender возвращает атрибут, значение которого было изменено. Аргумент args позволяет получить доступ к аргументам события: предыдущему и новому значению атрибута, а также контексту карточки объекта. modifier позволяет отреагировать на изменения и установить новое значение дополнительно одному или нескольким атрибутам. Изменения в значениях атрибутов, которые были сделаны с помощью modifier, не приводят к вызовам метода OnValueChanged. Возвращаемое значение типа boolean никак не используется в реализации метода на стороне приложения Pilot и может быть любым.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ObjectCardHandlerSample
{
[Export(typeof(IObjectCardHandler))]
public class ObjectCardHandler : IObjectCardHandler
{
public bool Handle(IAttributeModifier modifier, ObjectCardContext context)
{
var isObjectModification = context.EditiedObject != null;
}
public bool OnValueChanged(IAttribute sender, AttributeValueChangedEventArgs args, IAttributeModifier modifier)
{
}
}
}
Интерфейс позволяет установить новое значения для атрибутов элемента перед тем, как они будут показаны в карточке объекта.
Метод позволяет задать новое значение атрибуту.
void IAttributeModifier.SetValue(string name, string value);
где:
name - уникальное наименование атрибута типа.value - новое значение атрибута.Метод имеет несколько перегрузок:
void IAttributeModifier.SetValue(string name, string value);
void IAttributeModifier.SetValue(string name, long value);
void IAttributeModifier.SetValue(string name, double value);
void IAttributeModifier.SetValue(string name, DateTime value);
void IAttributeModifier.SetValue(string name, decimal value);
void IAttributeModifier.SetValue(string name, Guid value);
void IAttributeModifier.SetValue(string name, int[] value);
void IAttributeModifier.SetValue(string name, Guid[] value);
void IAttributeModifier.SetValue(string name, string[] value);
Контекст отображения карточки.
Поле содержит идетификатор объекта, для которого показана карточка. Если карточка показана для создания нового объекта, то поле содержит идентификатор, который будет присвоен новому объекту при создании.
Guid ObjectCardContext.CurrentObjectId { get; }
Поле содержит список отображаемых в карточке атрибутов. В этот список не входят сервисные атрибуты.
IEnumerable<IAttribute> ObjectCardContext.DisplayAttributes { get; }
Словарь текущих значений атрибутов карточки объекта, где ключ это имя атрибута, а значение - это значение атрибута.
IDictionary<string, object> ObjectCardContext.AttributeValues { get; }
Поле содержит описание типа элемента, для которого показана карточка.
IType ObjectCardContext.Type { get; }
Текущий редактируемый объект, для которого показана карточка. Null, если карточка показана для создания нового объекта.
IDataObject ObjectCardContext.EditiedObject { get; }
Поле содержит описание родительского элемента.
IDataObject ObjectCardContext.Parent { get; }
True, если карточка в режиме только для чтения, и атрибуты недоступны для изменения.
bool ObjectCardContext.IsReadOnly { get; }
Интерфейс IObjectChangeHandler позволяет подписаться на изменения, сделанные пользователем.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace Sample
{
[Export(typeof(IObjectChangeHandler))]
public class AnnulHandler : IObjectChangeHandler
{
private readonly string _annuledUserStateId;
[ImportingConstructor]
public AnnulHandler(IObjectsRepository repository)
{
var userStates = repository.GetUserStates();
var annuledUserState = userStates.FirstOrDefault(x => x.Name == Const.AnnuledUserState);
if (annuledUserState != null)
_annuledUserStateId = annuledUserState.Id.ToString();
}
public void OnChanged(IEnumerable<DataObjectChange> changes)
{
if(string.IsNullOrEmpty(_annuledUserStateId))
return;
foreach (var change in changes)
{
foreach (var attribute in change.New.Attributes)
{
if (Equals(attribute.Value, _annuledUserStateId))
{
object oldValue = null;
change.Old?.Attributes.TryGetValue(attribute.Key, out oldValue);
if (!Equals(oldValue, _annuledUserStateId))
OnAnnuled(change.New);
}
}
}
}
private void OnAnnuled(IDataObject obj)
{
...
}
}
}
IObjectChangeHandler.OnChangedДанный метод вызывается после того, как пользователь делает какое-либо изменение. В метод OnChanged параметром передается список произошедших изменений.
Представляет собой изменение над одним объектом
Состояние объекта до изменения. Равно null в случае создания объекта.
Состояние объекта после изменения.
Интерфейс IObjectChangeProcessor позволяет редактировать и отменять изменения, сделанные пользователем. Примеры использования данного интерфейса можно найти в проекте SubtreeUserStateAnuller.
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using Ascon.Pilot.SDK;
namespace SubtreeUserStateAnuller
{
[Export(typeof(IObjectChangeProcessor))]
public class ChangeProcessor : IObjectChangeProcessor
{
public bool ProcessChanges(IEnumerable<DataObjectChange> changes, IObjectModifier modifier)
{
//проверяем первое изменение
var change = changes.First();
//получаем pdf документы из изменения
var newPdfs = change.New.ActualFileSnapshot.Files.Select(f => f.Name).Where(f => f.EndsWith("pdf"));
var oldPdfs = change.Old.ActualFileSnapshot.Files.Select(f => f.Name).Where(f => f.EndsWith("pdf"));
//если для объекта приложен pdf файл - отменяем изменения, иначе применяем
if (newPdfs.Except(oldPdfs).Any())
return false;
return true;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Windows;
using System.Xml.Serialization;
using Ascon.Pilot.SDK;
using IDataObject = Ascon.Pilot.SDK.IDataObject;
namespace SubtreeUserStateAnuller
{
[Export(typeof(IObjectChangeProcessor))]
public class AnnulHandler : IObjectChangeProcessor
{
public const string Xaml = "<TextBlock Foreground=\"Red\" FontSize=\"20\">АННУЛИРОВАНО</TextBlock>";
private readonly string _annuledUserStateId;
[ImportingConstructor]
public AnnulHandler(IObjectsRepository repository)
{
var userStates = repository.GetUserStates();
var annuledUserState = userStates.FirstOrDefault(x => x.Name == Const.AnnuledUserState);
if (annuledUserState != null)
_annuledUserStateId = annuledUserState.Id.ToString();
}
public bool ProcessChanges(IEnumerable<DataObjectChange> changes, IObjectModifier modifier)
{
if (string.IsNullOrEmpty(_annuledUserStateId))
return true;
foreach (var change in changes)
{
foreach (var attribute in change.New.Attributes)
{
if (Equals(attribute.Value.ToString(), _annuledUserStateId))
{
object oldValue = null;
change.Old?.Attributes.TryGetValue(attribute.Key, out oldValue);
if (!Equals(oldValue, _annuledUserStateId))
AddGraphicLayer(change.New, modifier);
}
}
}
return true;
}
private void AddGraphicLayer(IDataObject dataObject, IObjectModifier modifier)
{
...
}
}
}
bool ProcessChanges(IEnumerable<DataObjectChange> changes, IObjectModifier modifier);
Данный метод вызывается после того, как пользователь делает какое-либо изменение.
где:
changes - список изменений. Подробнее см. DataObjectChange;
modifier - объект модификатора, с помощью которого можно вносить изменения в объект. Подробнее см. IObjectModifier;
Метод возвращает флаг, который показывает, следует ли применять изменения.
Интерфейс позволяет произвести валидацию изменений в карточке объекта перед их применением: созданием нового объекта или сохранением изменений в существующем объекте. Для этого интерфейс из пакета Ascon.Pilot.SDK.IObjectCardValidationBeforeSubmitHandler необходимо реализовать в одном из классов расширения и обязательно пометить этот класс атрибутом [Export].
Task<bool> ValidateObjectCardBeforeSubmitAsync(ObjectCardContext context, CancellationToken token);
где:
context - контекст карточки объекта, предоставляющий доступ к самому редактируемому объекту, его типу и текущим значениям атрибутов;
token - токен асинхронной операции в контексте которой расширением выполняется валиадация значений карточки. Может использоваться для того, чтобы отменить задачу валидации атрибутов, если соответствующий запрос пришёл от пользователя;
Метод ValidateObjectCardBeforeSubmitAsync вызывается, когда пользователь нажимает кнопку Создать или Сохранить в карточке объекта или кнопку Выдать в карточке задания, перед тем, как изменения будут непосредственно применены, и позволяет расширению проверить значения атрибутов в карточке объекта или задания в асинхронном режиме. Если в результате выполнения валидации проблем со значениями атрибутов не найдено, результатом задачи валидации должно быть значение true. В этом случае применение изменений продолжится как обычно. В противном случае, задача валидации должна вернуть значение false, что приведет к тому, что применение изменений не произойдёт и карточка объекта останется в режиме редактирования.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
using Ascon.Pilot.SDK.ObjectCard;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
namespace ObjectCardHandlerSample
{
[Export(typeof(IObjectCardValidationBeforeSubmitHandler))]
public class ObjectValidationSample : IObjectCardValidationBeforeSubmitHandler
{
public Task<bool> ValidateObjectCardBeforeSubmitAsync(ObjectCardContext context, CancellationToken token)
{
return Task<bool>.Factory.StartNew(() =>
{
var invalidValues = context.AttributesValues.Where(x => x.Value as string == "invalid_value").ToList();
if (invalidValues.Any())
{
ShowInvalidAttrsMessage(invalidValues);
return false;
}
return true;
}, token);
}
}
}
Интерфейс позволяет произвести валидацию изменений в диалоге создания или редактировании процесса перед их применением. Для этого интерфейс из пакета Ascon.Pilot.SDK.IWorkflowObjectCardValidationBeforeSubmitHandler необходимо реализовать в одном из классов расширения и обязательно пометить этот класс атрибутом [Export].
Task<bool> ValidateWorkflowObjectCardBeforeSubmitAsync(ObjectCardContext workflowCardContext, ObjectCardContext[][] stagesTaskCardContexts, CancellationToken token);
где:
workflowCardContext - контекст карточки процесса, предоставляющий доступ к самому редактируемому объекту процесса и текущим значениям атрибутов;
stagesTaskCardContexts - коллекция контекстов объектов заданий, входящих в процесс. Коллекция представляет собой двумерный массив: первый уровень соответствует этапам текущего процесса, второй уровень представляет контекст каждой задачи, входящий в соответствующий этап.
token - токен асинхронной операции в контексте которой расширением выполняется валидация значений карточки. Может использоваться для того, чтобы отменить задачу валидации атрибутов, если соответствующий запрос пришёл от пользователя;
Метод ValidateWorkflowObjectCardBeforeSubmitAsync вызывается, когда пользователь нажимает кнопку ОК в диалоге создания или редактирования процесса, перед тем, как изменения будут непосредственно применены, и позволяет расширению проверить значения атрибутов в карточке процесса и заданий, входящих в этот процесс, в асинхронном режиме. Если в результате выполнения валидации проблем со значениями атрибутов не найдено, результатом задачи валидации должно быть значение true. В этом случае применение изменений продолжится как обычно. В противном случае, задача валидации должна вернуть значение false, что приведет к тому, что применение изменений не произойдёт и диалог изменения процесса останется в режиме редактирования.
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
using Ascon.Pilot.SDK.ObjectCard;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
namespace ObjectCardHandlerSample
{
[Export(typeof(IWorkflowObjectCardValidationBeforeSubmitHandler))]
public class ObjectValidationSample : IWorkflowObjectCardValidationBeforeSubmitHandler
{
Task<bool> ValidateWorkflowObjectCardBeforeSubmitAsync(ObjectCardContext workflowCardContext, ObjectCardContext[][] stagesTaskCardContexts, CancellationToken token)
{
return Task<bool>.Factory.StartNew(() =>
{
var invalidValues = workflowCardContext.AttributesValues.Where(x => x.Value as string == "invalid_value").ToList();
if (invalidValues.Any())
{
ShowInvalidAttrsMessage(invalidValues);
return false;
}
var stage = 0;
foreach (var stageContexts in stagesTaskCardContexts)
{
stage++;
var task = 0;
foreach (var taskCardContext in stageContexts)
{
task++;
var taskInvalidValues = taskCardContext.AttributesValues.Where(x => x.Value as string == "invalid_value").ToList();
if (taskInvalidValues.Any())
{
ShowInvalidAttrsMessage(taskInvalidValues);
return false;
}
}
}
return true;
}, token);
}
}
}
Интерфейс позволяет перхватить обработку файлов прикладываемых к документу. Для этого необходимо реализовать интерфейс Ascon.Pilot.SDK.IFileHandler и пометить класс, реализующий интерфейс, атрибутом [Export]
bool Handle(string inputFile, out List<string> outputFiles, FileHandlerSource source);
где:
inputFile - путь к обрабатываему файлу;
outputFiles - колекция путей к новым файлам после обработки;
source - контекст срабатывания метода Handle:
FileHandlerSource.ObjectCreation диалог создания нового объекта;FileHandlerSourc.Publication публикация документа;FileHandlerSource.AutoImport диалог автоимпорта.Метод возвращает флаг, который показывает, следует ли применять результат обработки файлов.
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
namespace Ascon.Pilot.SDK.FileHandlerSample
{
[Export(typeof(IFileHandler))]
class FileHandler : IFileHandler
{
public bool Handle(string inputFile, out List<string> outputFiles, FileHandlerSource source)
{
outputFiles = new List<string>();
if (!File.Exists(inputFile))
return false;
if (!string.Equals(Path.GetExtension(inputFile), ".pdf", StringComparison.OrdinalIgnoreCase))
return false;
//some logic for pdf format as example
return true;
}
}
}
Интерфейс позволяет перехватывать события прикрепления файлов к объектам в карточке создания или редактирования объекта. Для этого необходимо реализовать интерфейс Ascon.Pilot.SDK.IDocumentFileHandler и пометить класс, реализующий интерфейс, атрибутом [Export].
bool OnAttached(string filePath, Guid objectId, ObjectCardContext context);
Метод вызывается после успешного выбора файла через диалог “Открыть файл” в карточке создания или редактирования объекта.
где:
filePath - полный путь к прикрепляемому файлу;objectId - идентификатор объекта, к которому прикрепляется файл;context - контекст карточки объекта, содержащий информацию о типе, атрибутах и других свойствах. Подробнее см. ObjectCardContext.Метод возвращает флаг, который показывает, успешно ли обработано событие прикрепления файла.
Для того, чтобы написать свое пользовательское действие для автоматизации процессов, в SDK придусмотрен ряд интерфейсов.
Интерфейс IAutomationActivity позволяет встроится в процесс автоматизации и обработать полученный изменения. Пример использования данного интерфейса можно найти в проекте SignMeAsActivity.
Пример встраивания в процесс автоматизации:
...
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
using Ascon.Pilot.SDK.Automation;
namespace SignMeAsActivity
{
[Export(typeof(IAutomationActivity))]
public class SignMeAsActivity : AutomationActivity
{
private readonly IDigitalSigner _digitalSigner;
[ImportingConstructor]
public SignMeAsActivity(IDigitalSigner digitalSigner)
{
_digitalSigner = digitalSigner;
}
// Имя activity должно совпадать с именем указанным в настройках автоматизации в myAdmin
public override string Name => nameof(SignMeAsActivity);
// Переопределим метод
public override async Task RunAsync(IObjectModifier modifier, IAutomationBackend backend, IAutomationEventContext context, TriggerType triggerType)
{
// Код действия здесь...
...
}
...
}
}
AutomationActivity - класс реализующий интерфейс IAutomationActivity. Устанавливает стандартные настройки действия по умолчанию. Например такие свойства как: SourceTypes, Target, RelationType и д.р.
В классе действия (activity) также можно воспользоваться импортированием зависимостей в конструктор с помощью атрибута ImportingConstructor.
string Name { get; }
Свойство возвращает имя действия (activity).
!!! Внимение !!! Возвращаемое имя должно совпадать с именем, указанным в скрипте автоматизации (json), задаваемом в настройках автоматизации в myAdmin.
Dictionary<string, object> Params { get; }
Свойство возвращает набор параметров, заданных в настройках атоматизации в myAdmin для этого действия (activity).
List<string> SourceTypes { get; }
Свойство возвращает набор типов для которых сработает действие. Типы задаются в настройках атоматизации в myAdmin при описании этого действия (activity).
TargetType? Target { get; }
Свойство возвращает значение на каго распространяется дейтсвие. Подробнее смотри TargetType
ObjectRelationType? RelationType { get; }
Свойство возвращает значение связи, на которые распространяется это действие (activity). Подробнее смотри ObjectRelationType
Dictionary<string, string> Errors { get; }
Свойство возвращает список ошибок при вызове действия (activity).
RelationFilterByChangeKind? RelationFilterByChangeKind { get; }
Свойство возвращает значение, указывающее на какой тип изменения связей реагирует действие (activity). Значение заполняется в myAdmin.
Task RunAsync(IObjectModifier modifier, IAutomationBackend backend, IAutomationEventContext context, TriggerType triggerType);
Метод вызывается когда срабатывает действие.
где:
modifier - объект модификатора, с помощью которого можно вносить изменения в объект. Подробнее см. IObjectModifier;
`backend` - объект доступа к различным типам или объектам в системе. Подробнее см. [IAutomationBackend](#IAutomationBackend);
`context` - объект доступа к инициирующему изменению и его свойствам Подробнее см. [IAutomationEventContext](#IAutomationEventContext);
`triggerType` - тип триггера. Подробнее см. [TriggerType](#TriggerType);
Интерфейс описывает контекст события автоматизации.
IDataObject Source { get; }
Свойство возвращает инициирующий событие элемент.
IEnumerable<IChange> Changes { get; }
Свойство возвращает все изменения, произошедшие в процессе изменения инициирующего элемента.
IPerson InitiatingPerson { get; }
Свойство возвращает пользователя инициирующего изменения.
DateTime EventDate { get; }
Свойство возвращает время начала изменения. Дата указа в UTC.
Интерфейс описывает объект доступа к данным доступным для действий.
Guid GetDatabaseId();
Метод возвращает идентификатор базы данных.
IDictionary<int, IType> GetTypes();
Метод возвращает словарь с описанием доступных типов элементов
IPerson CurrentPerson();
Метод возвращает текущего пользователя
IDictionary<int, IPerson> GetPeople();
Метод возвращает словарь с описанием доступных пользователей
IDictionary<int, IOrganisationUnit> GetOrganisationUnits();
Метод возвращает словарь с описанием доступных организационных единиц
IDataObject GetObject(Guid id);
Метод возвращает запрошенный элемент.
Перечисление описывает тип возможных триггеров в системе
None = 0
Значение по умолчанию
Client = 1
Триггер срабатывает только на клиенте
Server = 2
Триггер срабатывает только на сервере
ServerAndClient = Client | Server
Триггер срабатывает и на клиенте и на сервере
Перечисление описывает типы, на которые должно срабатывать действие (activity)
Self
Если в описании автоматизации указан тип Self, то действие (activity) должно срабатывать над элементом, инициировавшем изменения.
Relations
Если в описании автоматизации указан тип Relations, то действие (activity) должно срабатывать над элементами, которые связаны с инициировавшем изменения по типу связи указанному в свойстве RelationType действия (activity). Подробнее ObjectRelationType
Перечисление описывает типы возможных изменений связей у инициирующего элемента.
Added
Если в описании автоматизации указан тип Added, то действие (activity) должно срабатывать при добавлении связей.
Removed
Если в описании автоматизации указан тип Removed, то действие (activity) должно срабатывать при удалении связей.
public static IEnumerable<IDataObject> GetObjectsToExecute(IAutomationEventContext context, IAutomationBackend backend, IAutomationActivity sourceActivity)
Метод возвращает элементы в зависимости от настроек RelationFilterByChangeKind, TargetTypes и OjectRelationType в описании действия в myAdmin.
Для получения доступа к интерфейсам их необходимо передать в конструктор. Можно передавать любые из перечисленных ниже интерфейсов. При этом, конструктор обязательно необходимо пометить атрибутом [ImportingConstructor].
[Export(typeof(IObjectContextMenu))]
public class ModifyObjectsPlugin : IObjectContextMenu
{
private readonly IObjectModifier _modifier;
private readonly Repository _repository;
[ImportingConstructor]
public ModifyObjectsPlugin(IObjectModifier modifier, IObjectsRepository repository)
{
_modifier = modifier;
_repository = repository;
}
}
Интерфейс позволяет получить доступ к элементам, типам элементов и организационной структуре. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод позволяет получить информацию о текущем пользователе, вошедшем в систему.
IPerson IObjectsRepository.GetCurrentPerson();
Возвращает объект типа IPerson.
Метод позволяет получить информацию об организационной единице.
IOrganisationUnit IObjectsRepository.GetOrganisationUnit(int id);
где:
id - идентификатор должности или подразделения.Возвращает объект типа IOrganisationUnit.
Метод позволяет получить список организационных единиц.
IEnumerable<IOrganisationUnit> IObjectsRepository.GetOrganisationUnits();
где:
id - идентификатор должности или подразделения.Метод позволяет получить список всех пользователей.
IEnumerable<IPerson> IObjectsRepository.GetPeople();
Метод позволяет получить информацию о пользователе по идентификатору.
IPerson IObjectsRepository.GetPerson(int id);
где:
id - идентификатор пользователя.Метод позволяет получить информацию о типе элемента по идентификатору или по имени.
IType IObjectsRepository.GetType(int id);
где:
id - идентификатор типа элемента.IType IObjectsRepository.GetType(string name);
где:
name - имя типа элемента.Метод позволяет получить список всех типов.
IEnumerable<IType> IObjectsRepository.GetTypes();
Метод предназначен для получения элементов по их идентификаторам. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных элементов. Все запрошенные элементы будут загружены в методе OnNext.
IObservable<IDataObject> IObjectsRepository.SubscribeObjects(IEnumerable<Guid> ids);
где:
ids - список идентификаторов элементов.Пример:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ObjectsSample
{
[Export(typeof(IDataPlugin))]
public class ObjectsSamplePlugin : IDataPlugin, IObserver<IDataObject>
{
private readonly IObjectsRepository _repository;
private readonly List<IDataObject> _elements;
[ImportingConstructor]
public ObjectsSamplePlugin(IObjectsRepository repository)
{
_repository = repository;
_elements = new List<IDataObject>();
//Получить корневой элемент
_repository.SubscribeObjects(new[] { SystemObjectIds.RootObjectId }).Subscribe(this);
}
public void OnNext(IDataObject value)
{
_elements.Clear();
if (!_elements.Exists(e => e.Id == value.Id))
_elements.Add(value);
}
public void OnError(Exception error)
{
}
public void OnCompleted()
{
}
}
}
В данном примере описан сценарий получения элементов асинхронно с использованием метода SubscribeObjects. В данном подходе при реализации интерфейса IObserver<IDataObject> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext реализовано сохранение запрошенных элементов для дальнейшего использования.
Метод предназначен для подписки на изменения организационных единиц (должности и подразделения). Метод возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных объектов. Все запрошенные объекты будут загружены в методе OnNext.
IObservable<IOrganisationUnit> IObjectsRepository.SubscribeOrganisationUnits();
Пример:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ObjectsSample
{IOrganisationUnit.Title
[Export(typeof(IDataPlugin))]
public class ObjectsSamplePlugin : IDataPlugin, IObserver<IOrganisationUnit>
{
[ImportingConstructor]
public ObjectsSamplePlugin(IObjectsRepository repository)
{
repository.SubscribeOrganisationUnits().Subscribe(this);
}
public void OnNext(IOrganisationUnit value)
{
//TODO update organization unit
}
public void OnError(Exception error)
{
}
public void OnCompleted()
{
}
}
}
В данном примере описан сценарий обновления организационной единицы с использованием метода SubscribeOrganisationUnits. В данном подходе при реализации интерфейса IObserver<IOrganisationUnit> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext необходимо реализовать обновление организационной единицы.
Метод предназначен для подписки на изменения информации о пользователях. Метод возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных объектов. Все запрошенные объекты будут загружены в методе OnNext.
IObservable<IPerson> IObjectsRepository.SubscribePeople();
Пример:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ObjectsSample
{
[Export(typeof(IDataPlugin))]
public class ObjectsSamplePlugin : IDataPlugin, IObserver<IPerson>
{
[ImportingConstructor]
public ObjectsSamplePlugin(IObjectsRepository repository)
{
repository.SubscribePeople().Subscribe(this);
}
public void OnNext(IPerson value)
{
//TODO update person info
}
public void OnError(Exception error)
{
}
public void OnCompleted()
{
}
}
}
В данном примере описан сценарий обновления информации о пользователе с использованием метода SubscribePeople. В данном подходе при реализации интерфейса IObserver<IPerson> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext необходимо реализовать обновление организационной единицы.
Метод предназначен для подписки на изменения описания типов элементов. Метод возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных типов. Все запрошенные типы будут загружены в методе OnNext.
IObservable<IType> IObjectsRepository.SubscribeTypes();
Пример:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ObjectsSample
{
[Export(typeof(IDataPlugin))]
public class ObjectsSamplePlugin : IDataPlugin, IObserver<IType>
{
[ImportingConstructor]
public ObjectsSamplePlugin(IObjectsRepository repository)
{
repository.SubscribeTypes().Subscribe(this);
}
public void OnNext(IType value)
{
//TODO update element type info
}
public void OnError(Exception error)
{
}
public void OnCompleted()
{
}
}
}
В данном примере описан сценарий обновления информации о типе элемента с использованием метода SubscribeTypes. В данном подходе при реализации интерфейса IObserver<IType> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext необходимо реализовать обновление описания типа.
Метод предназначен для получения уведомлений выбранного типа. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на получения уведомлений. Полученные уведомление будут передаваться в метод OnNext.
IObservable<INotification> SubscribeNotification(NotificationKind kind);
где:
kind - тип уведомлений для подписки.Метод предназначен для подписки на изменения информации о чатах. Метод возвращает стандартный интерфейс IObservable, который позволяет подписаться на изменения запрошенных объектов. Все запрошенные объекты будут загружены в методе OnNext.
IObservable<IChatInfo> IObjectsRepository.SubscribeChats();
Пример:
using System.ComponentModel.Composition;
using Ascon.Pilot.SDK;
namespace ObjectsSample
{
[Export(typeof(IDataPlugin))]
public class ObjectsSamplePlugin : IDataPlugin, IObserver<IChatInfo>
{
[ImportingConstructor]
public ObjectsSamplePlugin(IObjectsRepository repository)
{
repository.SubscribeChats().Subscribe(this);
}
public void OnNext(IChatInfo value)
{
//TODO update chat info
}
public void OnError(Exception error)
{
}
public void OnCompleted()
{
}
}
}
В данном примере описан сценарий обновления информации о чате с использованием метода SubscribeChats. В данном подходе при реализации интерфейса IObserver<IChatInfo> необходимо оставить пустой реализацию методов OnError и OnCompleted во избежании ошибок в будущем. В методе OnNext необходимо реализовать обновление чата.
Метод предназначен для получения списка всех пользовательских состояний, зарегистрированных в базе.
Метод предназначен для получения списка всех машин состояний, зарегистрированных в базе.
Метод предназначен для получения списка всех доступных текущему пользователю отчетов.
Метод предназначен для получения информации о доступе пользователя к определенному объекту.
AccessLevel GetCurrentAccess(Guid objectId, int personId);
где:
objectId - идентификатор объектаpersonId - идентификатор пользователяМетод возвращает путь к файлу или папке, смонтированной на Pilot-Storage
string GetStoragePath(Guid objId);
Предоставляет информацию о файлах и папках на Pilot-Storage, находящихся по запрошенному абсолютному пути.
IEnumerable<IStorageDataObject> GetStorageObjects(IEnumerable<string> paths);
Монтирует элемент на Pilot-Storage. На Pilot-Storage могут быть смонтированы только элементы типов, помеченных флагом “Может монтироваться на диск”. Т.к. метод выполняется асинхронно, смонтированный элемент может быть недоступен на Pilot-Storage сразу после вызова метода.
void Mount(Guid objId);
Монтирует элемент на Pilot-Storage. На Pilot-Storage могут быть смонтированы только элементы типов, помеченных флагом “Может монтироваться на диск”.
Task MountAsync(Guid objId);
Метод предназначен для получения элементов истории объекта. Метод работает асинхронно. Возвращает стандартный интерфейс IObservable, который позволяет подписаться на получения элементов истории по одному объекту. Полученные элементы будут передаваться в метод OnNext.
IObservable<IHistoryItem> GetHistoryItems(IEnumerable<Guid> ids);
где:
ids - список идентификаторов элементов истории по одному объектуМетод предназначен для получения списка файлов, содержимое которых может быть безопасно удалено для освобождения места в локальном файловом хранилище. Использование данного метода демонстрируется в примере Ascon.Pilot.SDK.ClearCacheDaemon.
Task<IEnumerable<Guid>> LoadCleanableFileIds();
Интерфейс позволяет получить доступ к сообщениям и чатам
Загрузка списка сообщений по чату. Перед вызовом этого метода для нового чата, неоходимо вызвать метод LoadChatAsync для этого чата.
Task<List<IChatMessage>> LoadMessagesAsync(Guid chatId, DateTime dateFromUtc, DateTime dateToUtc, int maxNumber);
где:
chatId - идентификатор чатаdateFromUtc - минимальная серверная дата создания сообщения, попадающего в выборкуdateToUtc - максимальная серверная дата создания сообщения, попадающего в выборкуmaxNumber - максимальное количество сообщений, попадающих в выборкуЗагрузка участников чата
Task<IReadOnlyCollection<IChatMember>> LoadChatMembersAsync(Guid chatId, DateTime dateFromUtc);
где:
chatId - идентификатор чатаdateFromUtc - минимальная серверная дата создания сообщения, попадающего в выборкуОтправка сообщения
Task SendMessageAsync(IChatMessage message);
где:
IChatMessage - объект сообщения, полученный из IMessageBuilderПолучение чата по идентифкатору
Task<IChat> LoadChatAsync(Guid id);
где:
IChat - объект чатаПолучение чата по идентифкатору
Task<IReadOnlyList<IChatInfo>> LoadChatsAsync(DateTime next, int count, bool skipObjectRelated = true);
где:
IChatInfo - объект сведений о чатеnext - дата, после которой нужно загрузить чатыcount - максимальное количество возвращаемых чатовskipObjectRelated - Флаг пропуска чатов, связанных с объектамиПодписка на обновления чатов
IObservable<IChatInfo> SubscribeChats();
где:
IChatInfo - объект сведений о чатеПодписка на сообщения в чатах
IObservable<IChatMessage> SubscribeChatMessages();
где:
IChatMessage - объект сведений о сообщении в чатеИнтерфейс предназначен для создания, изменения и удаление элементов. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод позволяет создать новый элемент заданного типа.
IObjectBuilder IObjectModifier.Create(IDataObject parent, IType type);
где:
parent - родительский элемент, в котором создается новый элемент.type - тип создаваемого элемента.Метод возвращает объект типа IObjectBuilder, который позволяет заполнить элемент атрибутами и задать дополнительные свойства. Подробнее смотри интерфейс IObjectBuilder
Метод позволяет отредактировать заданный элемент.
IObjectBuilder IObjectModifier.Edit(IDataObject object);
где:
object - редактируемые элемент.Метод возвращает объект типа IObjectBuilder, который позволяет заполнить элемент атрибутами и задать дополнительные свойства. Подробнее смотри интерфейс IObjectBuilder
Метод позволяет переместить элемент из текущего родительского элемента в другой.
void IObjectModifier.Move(IDataObject object, IDataObject newParent);
где:
object - текущий элемент, который надо переместить;newParent - новый родительский элемент.Метод позволяет удалить элемент в корзину.
void IObjectModifier.Delete(IDataObject object);
где:
object - элемент, который надо удалить.Метод позволяет удалить элемент в корзину.
void IObjectModifier.DeleteById(Guid objectId);
где:
objectId - идентификатор элемента, который надо удалить.Метод позволяет изменить статус элемента.
void IObjectModifier.ChangeState(IDataObject @object, ObjectState state);
где:
object - элемент, статус которого нужно изменитьstate - новый статус элемента.Метод позволяет связать два элемента выбранной связью.
void IObjectModifier.CreateLink(IRelation relation1, IRelation relation2);
где:
relation1 - описание связи для первого объектаrelation2 - описание связи для второго объектаПример:
using Ascon.Pilot.SDK;
class ObjectsSample
{
private IObjectModifier _modifier;
{...}
private void CreateSourceFileLink(ObjectsViewContext context)
{
var object1 = context.SelectedObjects.First();
var object2 = context.SelectedObjects.Last();
//Create relations
var relationId = Guid.NewGuid();
var relationName = "RelationName";
var relationType = ObjectRelationType.Custom;
var relation1 = new Relation
{
Id = relationId,
Type = relationType,
Name = relationName,
TargetId = object2.Id
};
var relation2 = new Relation
{
Id = relationId,
Type = relationType,
Name = relationName,
TargetId = object1.Id
};
_modifier.CreateLink(relation1, relation2);
_modifier.Apply();
}
{...}
}
Метод позволяет удалить связь между объектами.
void IObjectModifier.RemoveLink(IDataObject obj, IRelation relation);
где:
obj - объект, из которого будет удалена связьrelation - удаляемая связьПример:
using Ascon.Pilot.SDK;
class ObjectsSample
{
private IObjectModifier _modifier;
{...}
private void RemoveSourceFileLink(ObjectsViewContext context)
{
var selected = context.SelectedObjects.First();
foreach (var relation in selected.Relations.Where(x => x.Type == ObjectRelationType.SourceFiles))
{
_modifier.RemoveLink(selected, relation);
}
_modifier.Apply();
}
{...}
}
Применить все сделанные над элементами изменения. Без вызова этого метода изменения не будут применены.
void IObjectModifier.Apply();
Очистить все изменения, сделанные над элементами, без применения. Возвращает объект modifier к своему изначальному состоянию.
void IObjectModifier.Clear();
Интерфейс обеспечивает возможность наполнения или редактирования элементов атрибутами и дополнительными свойствами.
IObjectBuilder SetAttribute(string name, string value);
Метод задает или изменяет атрибут с заданным именем.
где:
name - имя атрибута.value - новое значение атрибута.Метод имеет несколько перегрузок:IObjectBuilder SetAttribute(string name, string value); - для установки строкового значения атрибута.IObjectBuilder SetAttribute(string name, int value); - для установки целочисленного значения атрибута.IObjectBuilder SetAttribute(string name, long value); - для установки целочисленного 64-разрядного значения атрибута.IObjectBuilder SetAttribute(string name, DateTime value); - для установки значения атрибута времени.IObjectBuilder SetAttribute(string name, double value); - для установки цифрового значения атрибута с плавающей точкой.IObjectBuilder SetAttribute(string name, decimal value); - для установки денежного значения атрибута.IObjectBuilder SetAttribute(string name, Guid value); - для установки значения атрибута идентификатора Guid.IObjectBuilder SetAttribute(string name, int[] value); - для установки значения атрибута список идентификаторов типа int.IObjectBuilder SetAttribute(string name, string[] value); - для установки значения атрибута список идентификаторов типа string.
IObjectBuilder RemoveAttribute(string name);
Метод удаляет атрибут с заданным именем.
где:
- `name` - имя атрибута.
```cpp
IObjectBuilder AddRelation(string name, ObjectRelationType type, Guid sourceId, Guid targetId, DateTime versionId);
Метод добавляет новую связь к актуальной версии объекта.
где:
name - имя связи.type - тип связи.sourceId - идентификатор первого объекта.targetId - идентификатор второго объекта.versionId - идентификатор версии второго объекта.IObjectBuilder AddOrReplaceFile(string name, Stream stream, IFile file, DateTime creationTime, DateTime lastAccessTime, DateTime lastWriteTime);
Метод добавляет или заменяет файл к заданному элементу.
где:
name - имя файла.stream - поток файла.file - описание файла.creationTime - дата создания файла.lastAccessTime - дата последнего чтения из файла.lastWriteTime - дата последнего изменения файла.IObjectBuilder ReplaceFileInSnapshot(DateTime snapshotCreated, Guid fileToReplace, string name, Stream stream, DateTime creationTime, DateTime lastAccessTime, DateTime lastWriteTime);
Метод заменяет файл в заданном снимке файлов (данное действие доступно только пользователю с правами администратора).
где:
snapshotCreated - временная метка снимка файлов.fileToReplace - идентификатор заменяемого файла.name - имя файла.stream - поток файла.creationTime - дата создания файла.lastAccessTime - дата последнего чтения из файла.lastWriteTime - дата последнего изменения файла.IObjectBuilder AddFile(string path);
Метод добавляет файл к заданному элементу.
где:
path - путь до файла, который надо добавить.IObjectBuilder AddFile(string name, Stream stream, DateTime creationTime, DateTime lastAccessTime, DateTime lastWriteTime);
где:
name - имя добавляемого файла.stream - поток добавляемого файла.creationTime - дата создания файла.lastAccessTime - дата последнего доступа к файлу.lastWriteTime - дата последнего доступа на запись в файл.IObjectBuilder RemoveFile(Guid fileId);
Метод-расширение интерфейса IObjectBuilder. удаляет файл из ActualFilesSnapshot элемента.
где:
fileId - идентификатор файла, который надо удалить.IObjectBuilder AddAccessRecords(int orgUnitId, AccessLevel level, DateTime validThrough, AccessInheritance inheritance, AccessType type);
Метод добавляет права доступа на элемент.
где:
orgUnitId - идентификатор должности или подразделения, на которое будет добавлено право доступа.level - уровень доступа к элементу.validThrough - срок действия права.inheritance - уровень наследования прав доступа.AccessInheritance.None - без наследованияAccessInheritance.InheritUntilSecret - наследование для общедоступных (скрытые элементы прерывают цепочку наследования прав доступа)AccessInheritance.InheritWholeSubtree - наследование для всех (запись прав доступа будет наследоваться для всех дочерних элементов, в том числе скрытых). Добавление или удаление прав доступа с этой опцией доступно только администратору базы данных.type - тип записи прав доступа. Доступные значения:AccessType.Allow - разрешительное право доступаAccessType.Deny - запретительное право доступа. Добавление или удаление запретительных прав доступа доступно только администратору базы данных.IObjectBuilder AddAccessRecords(int orgUnitId, AccessLevel level, DateTime validThrough, AccessInheritance inheritance, AccessType type, int[] typeIds);
Метод добавляет права доступа на элемент.
где:
orgUnitId - идентификатор должности или подразделения, на которое будет добавлено право доступа.level - уровень доступа к элементу.validThrough - срок действия права.inheritance - уровень наследования прав доступа.AccessInheritance.None - без наследованияAccessInheritance.InheritUntilSecret - наследование для общедоступных (скрытые элементы прерывают цепочку наследования прав доступа)AccessInheritance.InheritWholeSubtree - наследование для всех (запись прав доступа будет наследоваться для всех дочерних элементов, в том числе скрытых). Добавление или удаление прав доступа с этой опцией доступно только администратору базы данных.type - тип записи прав доступа. Доступные значения:AccessType.Allow - разрешительное право доступаAccessType.Deny - запретительное право доступа. Добавление или удаление запретительных прав доступа доступно только администратору базы данных.typeIds - идентификаторы типов для которых будет добавлено право доступа, null - значит все типы.IObjectBuilder RemoveAccessRecords(Func<IAccessRecord, bool> predicate);
Метод удаляет права доступа на элемент по предикату.
где:
predicate - предикат, соответствующие которому права доступа будут удалены из элемента.IObjectBuilder MakeSecret();
Метод позволяет сделать элемент скрытым.
IObjectBuilder MakePublic();
Метод позволяет сделать элемент общедоступным.
IObjectBuilder CreateFileSnapshot(string reason);
Метод позволяет создать снимок файлов и указать причину. Текущие файлы будут перемещены в историю.
где:
reason - причина создания снимка файлов.IObjectBuilder MakeSnapshotActual(string reason, IFilesSnapshot snapshot);
Метод позволяет сделать выбранный снимок файлов текущим.
где:
reason - причина создания снимка файлов.snapshot - снимок, который надо сделать текущим (актуальным).IObjectBuilder AddSubscriber(int personId);
Метод позволяет подписаться на изменения элемента.
где:
personId - идентификатор пользователя.IObjectBuilder RemoveSubscriber(int personId);
Метод позволяет отписаться от изменений элемента.
где:
personId - идентификатор пользователя.IObjectBuilder SetIsDeleted(bool isDeleted);
Метод позволяет задать элементу состояние удалено безвозвратно.
где:
isDeleted - флаг указывающий удалить объект или нет.IObjectBuilder SetIsInRecycleBin(bool isInRecycleBin);
Метод позволяет задать элементу состояние удалено корзину.
где:
isInRecycleBin - флаг указывающий удалить объект в корзину или нет.IObjectBuilder SetParent(Guid parentId);
Метод позволяет задать элементу нового родителя.
где:
parentId - идентификатор нового родителя.IObjectBuilder SetType(IType type);
Метод позволяет задать элементу тип.
где:
type - тип элемента.ВНИМАНИЕ!
Рекомендуется использовать этот метод только для восстановления безвозвратно удаленных объектов. В остальных случаях это может привести к неработоспособности системы.
IObjectBuilder SetCreator(int creatorId);
Метод позволяет задать создателя элемента.
где:
creatorId - идентификатор пользователя (не должности).
IObjectBuilder SetCreationDate(DateTime dateTime);
Метод позволяет задать дату создания элемента (доступно только при создании нового элемента).
где:
dateTime - дата/время создания в UTC.IObjectBuilder Lock();
Метод позволяет заблокировать объект для изменений текущим пользователем.
IObjectBuilder Unlock();
Метод позволяет разблокировать объект.
IObjectBuilder SaveHistoryItem();
Если метод SaveHistoryItem был вызван в процессе конструирования изменения, при применении изменения предыдущее состояние объекта будет сохранено в IDataObject.HistoryItems.
IObjectBuilder SetFileState(Guid fileId, Guid toStateId, DateTime snapshotCreated);
Метод позволяет перевести файл в заданное состояние, если переход для него доступен по группе состояний и правам доступа.
где:
fileId - идентификатор файла;toStateId - идентификатор состояния, в которое необходимо перевести файл;snapshotCreated - дата создания версии.ISignatureModifier SetSignatures(Predicate<IFile> selectFilesPredicate);
Метод позволяет задать новые запросы на подпись к выбранным файлам.
где:
selectFilesPredicate - функция выбора набора файлов.Возвращает объект типа ISignatureModifier с помощью, которого можно изменить набор запросов на подпись.
Интерфейс обеспечивает возможность создания и наполнения дополнительными данными сообщений.
IChatMessage Message { get; }
Вовзвращает полученное в результате создания сообщение
IMessageBuilder CreateChatMessage(MessageType type, Guid chatId);
Создает сообщение
где:
type - тип сообщения.chatId - идентификатор чата.IMessageBuilder AddText(string text);
Заполняет Message.Data для текстового сообщения
где:
text - текст сообщения.IMessageBuilder AddText(string text, bool isReadOnly);
Заполняет Message.Data для текстового сообщения
где:
text - текст сообщения.isReadOnly - определяет, будет ли текстовое сообщение доступно для редактирования.IMessageBuilder AddChatCreationData(string name, string description, ChatKind type);
Заполняет Message.Data данными для создания чата
где:
name - имя чата.description - описание чатаtype - тип чатаIMessageBuilder AddChatRelation(ChatRelationType relationType, Guid objectId);
Заполняет Message.Data данными для создания связи чата с объектом
где:
relationType - тип связи.objectId - идентификатор связываемого объекта.IMessageBuilder AddChatMemberData(int personId, bool isNotifiable, bool isAdmin)
Заполняет Message.Data данными для добавляения и изменения параметров участника чата
где:
personId - идентификатор участника чата.isNotifiable - >признак получения участником уведомлений по чатуisAdmin -признак администратора чата.IMessageBuilder DeleteChatMember(int personId);
Заполняет Message.Data данными для удаления участника чата
где:
personId - идентификатор участника чата.IDataObject DataObject { get; }
Свойство возвращает пустую болванку редактируемого элемента с заполненным идентификатором элемента и идентификатором родительского элемента.
Интерфейс прадназначен для изменения запросов на подпись в объекте.
ISignatureBuilder Add(Guid id);
где:
id - идентификатор новго запроса на подпись.Метод добавляет новый запрос на подпись. Возвращаемое значение ISignatureBuilder.
ISignatureModifier Remove(Predicate<ISignatureRequest> findSignature);
где:
findSignature - фильтр;Метод метод удаляет запросы на подпись согласно заданному фильтру.
void SetSign(Guid id, string sign);
где:
id - идентификатор запроса на подпись;sign - подпись (идентификатор файла подписи в формате string);Метод добавляет подпись (идентификатор файла подписи в формате string) к запросу.
ISignatureModifier SetPublicKeyOid(Guid id, string publicKeyOid);
где:
id - идентификатор запроса на подпись;publicKeyOid - идентификатор криптоалгоритма;Метод заполняет идентификатор криптоалгоритма, которым была создана подпись.
ISignatureModifier SetLastSignCadesType(Guid id, CadesType cadesType);
где:
id - идентификатор запроса на подпись;cadesType - CadesType последней подписи в запросе;Метод заполняет CadesType последней подписи в запросе.
ISignatureModifier SetIsAdvancementRequired(Guid id, bool isAdvancementRequired);
где:
id - идентификатор запроса на подпись;isAdvancementRequired - определяет, нужно ли подписи усовершенствование;Метод заполняет поле в запросе, определяющее нужно ли подписи усовершенствование;
Интерфейс предназначен для изменения запроса на подпись.
Метод изменяет идентификатор базы данных.
ISignatureBuilder WithPositionId(int positionId);
где:
positionId - идентификатор должности.Метод изменяет должность у запроса на подпись.
ISignatureBuilder WithRole(string role);
где:
role - роль подписанта.Метод изменяет роль подписанта.
ISignatureBuilder WithSign(string sign);
где:
sign - цифровая подпись в формате Base64.Метод добавляет информацию о подписи в запрос (sign будет добавлен в коллекцию ISignatureRequest.Signs).
ISignatureBuilder WithRequestSigner(string requestSigner);
где:
requestSigner - отображаемое имя должности.Метод изменяет отображаемое имя должности подписанта.
ISignatureBuilder WithIsAdditional(bool value);
где:
value - значение.Метод изменяет флаг, указывающий на то, является ли запрос на подпись виртуальным.
ISignatureBuilder WithObjectId(Guid objectId);
где:
objectId - идентификатор объекта.Метод изменяет идентификатор объекта.
Интерфейс обеспечивает работу с телами файлов. Получить интерфейс можно через конструктор, помеченный атрибутом [ImportingConstructor].
Метод показывает, существует-ли тело файла с заданным идентификатором файла.
bool IFileProvider.Exists(Guid fileId);
где:
fileId - идентификатор файла.Метод показывает, полностью-ли загружен файл с сервера.
bool IFileProvider.IsFull(Guid fileId);
где:
fileId - идентификатор файла.Метод открывает заданный файл на чтение. Сигнатура метода:
Stream IFileProvider.OpenRead(IFile file);
где:
file - открываемый файл.Получение результирующего Stream не запускает скачивание тела файла с сервера, а возвращает “ленивый” поток. Рассмотрим на примере:
Предположим, что у нас на клиенте ранее не запрашивался file длиной 100 байт.
var stream = fileProvider.OpenRead(file1); // возвращается "ленивый" поток, с сервера ничего не запрашивается
var buffer = new byte[50];
stream.Read(buffer, 0, buffer.Length); // поток понимает, что этих 50 байт у него нет, скачивает их с сервера и кэширует, буффер заполняется данными. Если нет соединения с сервером, будет сгенерировано исключение.
stream.Read(buffer, 0, buffer.Length); // поток перед этим вызовом уже на 50 позиции, так что будут скачаны следующие 50 байт, и они также будут закэшированы. Теперь файл прочитан и закэширован полностью (все 100 байт), и вызов IsFull после этого вернет true.
long IFileProvider.GetFileSizeOnDisk(Guid fileId)
Получает объем занимаемого файлом места на диске в локальном файловом хранилище. Не обязательно соответствует размеру файла на сервере, т.к. файл на клиенте может быть не загружен совсем или загружен частично.
void IFileProvider.DeleteLocalFile(Guid fileId)
Удаляет содержимое файла из локального файлового хранилища. Файл на сервере при этом остается, и при следующем обращении к файлу на клиенте с помощью метода IFileProvider.OpenRead файл будет загружен на клиент повторно.
Данный метод может быть использован для очистки занимаемого файлом места в локальном файловом хранилище.
IPilotStorageListenerИнтерфейс позволяет отслеживать изменения состава папок и состояний файлов и папок на Pilot-Storage. Данный интерфейc должен быть реализован классом на стороне расширения, и класс должен быть помечен атрибутом [Export(typeof(IPilotStorageListener))]. Данный интерфейc содержит методы:
Метод будет вызван при добавлении/появлении файла на Pilot-Storage
void FileAdded(Guid id, string path, StorageObjectState state, NotificationTrigger trigger);
где:
id - идентификатор объекта, связанного с файлом на Pilot-Storage.path - полный путь к добавленному файлу.state - текущее состояние файла.trigger - определяет, был ли файл добавлен на Pilot-Storage вследствие изменения (добавления текущим или другим пользователем) или загрузки структуры файлов и папок при монтировании проекта (в том числе, при старте приложения).Метод будет вызван, если по каким-то причинам (удаление/перемещение/права доступа и т.д.) файл больше не существует на Pilot-Storage
void FileRemoved(Guid id, string path, NotificationTrigger trigger);
где:
id - идентификатор объекта, связанного с файлом на Pilot-Storage.path - полный путь к удаленному файлу.trigger - не имеет практического смысла в случае FileRemoved, оставлен для возможности дальнейшего расширения.Метод будет вызван при редактировании содержимого файла на Pilot-Storage. Метод FileEdited может быть вызван несколько раз при однократном редактировании файла инструментом, т.к. запись в файл, как правило, ведется блоками фиксированного размера, зависящего от инструмента, редактирующего файл. Метод будет вызван при записи каждого такого блока.
void FileEdited(Guid id, string path, StorageObjectState state, NotificationTrigger trigger);
где:
id - идентификатор объекта, связанного с файлом на Pilot-Storage.path - полный путь к изменяемому файлу.state - текущее состояние файла.trigger - не имеет практического смысла в случае FileEdited, оставлен для возможности дальнейшего расширения.Метод будет вызван при добавлении/появлении папки на Pilot-Storage
void DirectoryAdded(Guid id, string path, StorageObjectState state, NotificationTrigger trigger);
где:
id - идентификатор объекта, связанного с папкой на Pilot-Storage.path - полный путь к добавленной папке.state - текущее состояние папки.trigger - определяет, была ли папка добавлена на Pilot-Storage вследствие изменения (добавления текущим или другим пользователем) или загрузки структуры файлов и папок при монтировании проекта (в том числе, при старте приложения). Метод будет вызван, если по каким-то причинам (удаление/перемещение/права доступа и т.д.) папка больше не существует на Pilot-Storage
void DirectoryRemoved(Guid id, string path, NotificationTrigger trigger);
где:
id - идентификатор объекта, связанного с папкой на Pilot-Storage.path - полный путь к удаленной папке.trigger - не имеет практического смысла в случае DirectoryRemoved, оставлен для возможности дальнейшего расширения.Метод будет вызван при изменении состояния файла на Pilot-Storage
void FileStateChanged(Guid id, string path, StorageObjectState state, NotificationTrigger trigger);
где:
id - идентификатор объекта, связанного с файлом на Pilot-Storage.path - полный путь к измененному файлу.state - новое состояние файла.trigger - определяет, произошло ли изменение состояния файла на Pilot-Storage вследствие изменения данных или загрузки структуры файлов и папок при монтировании проекта (в том числе, при старте приложения). Метод будет вызван при изменении состояния папки на Pilot-Storage
void DirectoryStateChanged(Guid id, string path, StorageObjectState state, NotificationTrigger trigger);
где:
id - идентификатор объекта, связанного с папкой на Pilot-Storage.path - полный путь к измененной папке.state - новое состояние папки.trigger - определяет, произошло ли изменение состояния папки на Pilot-Storage вследствие изменения данных или загрузки структуры файлов и папок при монтировании проекта (в том числе, при старте приложения). IPilotStorageCommandControllerИнтерфейс позволяет вызывать команды Pilot-Storage. Получить интерфейс можно через конструктор, помеченный атрибутом [ImportingConstructor].
Вызов команды Pilot-Storage
void Execute(PilotStorageCommand command, params string[] paths);
где:
command - вызываемая команда.paths - список полных путей к файлам или папкам, для которых будет вызвана команда.Проверяет возможность вызова команды Pilot-Storage для указанных файлов и папок.
void CanExecute(PilotStorageCommand command, params string[] paths);
где:
command - команда.paths - список полных путей к файлам или папкам, для которых будет проверена возможность вызова команды.Список доступных команд описан перечислением PilotStorageCommand.
Commit - отправка изменений по файлу(или файлам в папке) на серверDownload - загрузка содержимого файла (или файлов в папке) с сервераGetLatestVersion - обновление содержимого файла (или файлов в папке) на самую свежую версиюRevert - отмена изменений по файлу (или файлам в папке).Subsribe - подписка на изменения по файлу/папке.Unsubsribe - отписка от изменений по файлу/папке.Unmount - размонтирование. Работает только для папок верхнего уровня.Lock - блокировка файла.Unlock - разблокировка файла.Freeze - заморозка файла/папки.Unfreeze - разморозка файла/папки.Publish - публикация файла в ECM документ.PublishAndCommit - публикация файла в ECM документ с последующей отправкой изменений по файлу на сервер.AppendPublish - публикация файла добавлением новых страниц в ECM документ.AppendPublishAndCommit - публикация файла добавлением новых страниц в ECM документ с последующей отправкой изменений по файлу на сервер.UpdateFilesAttributes - заполнение полей в файле значениями атрибутов ECM документа.Discard - отмена непринятых сервером изменений по файлу/папке.
Интерфейс позволяет получить различную информацию о клиенте. Получить интерфейс можно через конструктор, помеченный атрибутом [ImportingConstructor].
ClientType GetClientType();
Метод позволяет получить тип клиента. Подробнее см ClientType
string AutoimportDirectory { get; set; }
Получить путь до папки автоимпорта.
Uri ConnectionString { get; }
Получить адрес подключения к серверу Pilot-Server.
Интерфейс позволяет рендерить XPS документы в растровое изображение. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод возвращает список отрендеренных страниц в формате Stream.
IEnumerable<Stream> IFileProvider.RenderXpsToBitmap(Stream xpsStream, double quality = 1.0);
где:
xpsStream - поток XPS документы.quality - качество, в котором будет рэндериться (от 0 до 6).IFileSaverИнтерфейс позволяет сохранять документы (повторяет логику работы команды “Отправить -> На диск”). Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод сохраняет файлы документа по указанному пути.
Task<IList<string>> IFileSaver.SaveFileAsync(IDataObject dataObject, string outputFilePath, FileSaverOptions options = null);
где:
dataObject - документ с файлами.outputFilePath - путь сохранения файлов.options - дополнительные параметры для IFileSaver.
Метод сохраняет файлы документа выбранной версии по указанному пути.
Task<IList<string>> IFileSaver.SaveFileVersionAsync(IDataObject dataObject, DateTime snapshot, string outputFilePath, FileSaverOptions options = null);
где:
dataObject - документ с файлами.snapshot - Created timestamp версии IFilesSnapshot для сохранения.outputFilePath - путь сохранения файлов.options - дополнительные параметры для IFileSaver.Дополнительные параметры для IFileSaver.
Свойства
GraphicLayerOption GraphicLayerOption { get; set; }
Определяет, как вшивать элементы в XPS файл при сохранении.
Определяет, как вшить графические слои, метки и штрихкоды в XPS файл при сохранении.
Поля
InjectFloatingRelatable
Вшить в зависимости от параметра IsFloating у элементов.
ForceInject
Вшить все элементы.
KeepAllAsFloating
Добавить к файлу все элементы как плавающие.
LoseGraphicLayers
Ничего не вшивать и не добавлять к документу, кроме подписей.
Интерфейс позволяет получить номер текущей страницы просмотрщика документов и произвести увеличение/уменьшение масштаба на элементе графического слоя или аннотации. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Свойство возвращает номер открытой в просмотрщике страницы (от 0 до N-1)
Метод производит увеличение/уменьшение масштаба на элементе графического слоя или аннотации по его идентификатору
void ZoomToElement(Guid id, double scale = 1);
где:
id - Guid графического элемента или аннотации.scale - изменение масштаба (от 0 до 1). 1 - максимальный масштабМетод позволяет добавить обработчик клика левой кнопки мыши.
void SubscribeLeftMouseClick(IMouseLeftClickListener leftMouseClickListener);
где:
leftMouseClickListener - объект реализующий интерфейс IMouseLeftClickListenerМетод позволяет удалить обработчик клика левой кнопки мыши.
Метод позволяет скрыть или показать указанные по идентификатору графические элементы.
void SetGraphicLayerElementsVisibility(IList<Guid> elementIds, bool hidden);
где:
elementIds - Guid’ы графических элементов.hidden - true - скрывать, false - показыватьИнтерфейс позволяет сохранять скомпонованный XPS документ по указанному пути. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод сохраняет скомпонованный документ по пути и производит подписку на событие завершения сохранения
void SaveMergedXps(string filepath, IXpsMergerSaveListener saveListener);
где:
filepath - путь для сохранения.saveListener - обработчик события завершения сохранения документаИнтерфейс позволяет обработать завершение сохранения скомпонованного XPS документа. Для использования необходимо создать класс, унаследованный от абстрактного XpsMergerSaveListener, и передать его аргументом в метод IXpsMerger.SaveMergedXps
Метод вызывается при завершении сохранения документа
void OnSaveCompleted(string filepath);
где:
filepath - путь до сохраненного документа.Интерфейс представляет элемент графического слоя на XPS документах. Каждый графический элемент представлен в виде 2 файлов, хранящихся в объекте.
Первый файл содержит описательную часть графического элемента, а именно xml-сериализованный объект, унаследованный от IGraphicLayerElement. Имя первого файла должно быть создано по правилу GraphicLayerElementConstants.GRAPHIC_LAYER_ELEMENT + ElementId, где
ElementId - идентификатор графического элемента,Второй файл представляет содержимое графического элемента (XAML или BITMAP). Имя второго файла должно быть создано по правилу GraphicLayerElementConstants.GRAPHIC_LAYER_ELEMENT_CONTENT + ContentId, где
ContentId - идентификатор содержимого графического элементаGuid ElementId { get; }
Идентификатор графического элемента
Guid ContentId { get; }
Идентификатор содержимого графического элемента
double OffsetY { get; }
Отступ по вертикали в точках
double OffsetX { get; }
Отступ по горизонтали в точках
Point Scale { get; }
Масштаб по X и Y, по-умолчанию (1,1)
double Angle { get; }
Угол поворота
int PositionId { get; }
Идентификатор пользователя, у которого есть права на редактирования элемента (если 0, то редактировать могут все)
int PageNumber { get; }
Номер страницы, на которую наложен графический элемент (от 0)
VerticalAlignment VerticalAlignment { get; set; }
Вертикальное выравнивание
HorizontalAlignment HorizontalAlignment { get; set; }
Горизонтальное выравнивание
string ContentType { get; set; }
Тип содержимого графического элемента (GraphicLayerElementConstants.XAML или GraphicLayerElementConstants.BITMAP)
bool IsFloating { get; set; }
Определяет, является ли графический элемент плавающим (будет ли он встраиваться в документ при создании запроса на подпись или отправке на диск). Если true, то графический элемент никогда не будет вшит и всегда будет доступен для перемещения и удаления.
Класс с константами для работы с графическим слоем
public const string GRAPHIC_LAYER_ELEMENT = "PILOT_GRAPHIC_LAYER_ELEMENT_";
Константа для обозначения графического элемента
public const string GRAPHIC_LAYER_ELEMENT_CONTENT = "PILOT_CONTENT_GRAPHIC_LAYER_ELEMENT_";
Константа для обозначения содержимого графического элемента.
public const string XAML = "xaml";
Константа для обозначения содержимого XAML.
public const string BITMAP = "bitmap";
Константа для обозначения содержимого растровой графики.
public static string Version = "2";
Константа для обозначения версии описания графического элемента.
Для получения доступа к интерфейсам их необходимо передать в конструктор. Можно передавать любые из перечисленных ниже интерфейсов. При этом конструктор необходимо пометить атрибутом [ImportingConstructor].
[Export(typeof(IObjectContextMenu))]
public class ModifyObjectsPlugin : IObjectContextMenu
{
private readonly ITabServiceProvider _
viceProvider;
[ImportingConstructor]
public ModifyObjectsPlugin(ITabServiceProvider tabServiceProvider)
{
_tabServiceProvider = tabServiceProvider;
}
}
Интерфейс обеспечивает работу с вкладками главного окна клиента Pilot-ICE/ECM. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
IEnumerable<string> GetTabPageTitles();
Метод возвращает список заголовков открытых вкладок.
string ITabServiceProvider.GetActiveTabPageTitle();
Метод возвращает заголовок активной вкладки.
void ITabServiceProvider.ActivateTabPage(string title);
Вызов метода активирует вкладку с заданным заголовком.
где:
title - заголовок вкладки для активации.void ITabServiceProvider.OpenNewTabPage(bool isInOtherPane = false);
Метод открывает вкладку Новая вкладка в текущей панели вкладок или в новой.
где:
isInOtherPane - флаг, указывающий где открыть новую вкладку:true - открыть вкладку в новой панели вкладок;false - открыть вкладку в текущей панели вкладок. Значение по умолчанию.void ITabServiceProvider.OpenStandardTab(StandardTabType tabType);
Метод открывает новую стандартную вкладку в текущей панели вкладок.
где:
tabType - тип стандартной вкладки:Docs - обозреватель документов;Reports - отчеты;Chats - переписка;XpsMerger - компоновщик документов;Tasks - задания.void ITabServiceProvider.OpenTabPage(string title, FrameworkElement view, bool isInOtherPane = false);
Метод открывает новую вкладку с заданным контентом в текущей панели вкладок или в новой.
где:
title - локализованный заголовок открываемой вкладки;view - контент, который будет отображаться в открываемой вкладке;isInOtherPane - флаг, указывающий где открыть новую вкладку:true - открыть вкладку в новой панели вкладок.false - открыть вкладку в текущей панели вкладок. Значение по умолчанию.void ITabServiceProvider.CloseTabPage(string title);
Метод закрывает первую открытую вкладку с заданным заголовком.
где:
title - локализованный заголовок закрываемой вкладки.void ITabServiceProvider.UpdateTabPageContent(string oldTitle, string newTitle, FrameworkElement view);
Метод обновляет контент в открытой вкладке с заданным заголовком.
где:
oldTitle - локализованный заголовок вкладки, в которой меняется контент;newTitle - новый локализованный заголовок вкладки;view - новый контент, который будет отображаться во вкладке.void ITabServiceProvider.UpdateTabPageContent(Guid tabId, string title, FrameworkElement view);
Метод обновляет контент и заголовок вкладки, которая определяется ее идентификатором.
где:
tabId - идентификатор вкладки, в которой меняется заголовок и контент;title - новый локализованный заголовок вкладки;view - новый контент, который будет отображаться во вкладке.void ITabServiceProvider.UpdateActiveTabPageContent(FrameworkElement view);
Метод обновляет контент в текущей открытой вкладке.
где:
view - новый контент, который будет отображаться во вкладке.void ITabServiceProvider.ShowElement(Guid id);
Метод открывает вкладку (или использует существующую) и переходит к указаному объекту
где:
id - идентификатор объекта для навигации.void ITabServiceProvider.ShowElement(Guid id, bool openNewTab);
Метод открывает вкладку (или использует существующую) и переходит к указаному объекту
где:
id - идентификатор объекта для навигации;openNewTab - флаг, указывающий на необходимость открытия новой вкладки.void ITabServiceProvider.ShowElement(Guid id, DateTime version);
Метод открывает вкладку (или использует существующую) и переходит к указаной версии объекта
где:
id - идентификатор объекта для навигации;version - дата создания версии.void ITabServiceProvider.ShowElement(Guid id, DateTime version, object[] args);
Перегруженый вариант метода для перехода к объекту, принимающий список аргументов для навигации. Используется для перехода к объекту отчёта в случае, если необходимо не только открыть указанный объект, но и передать значения параметров построения отчёта.
где:
id - идентификатор объекта отчёта;version - дата создания версии, не применимо для отчётов, заполняется DateTime.MinValue;args - параметры навигации. Для передачи определенных объектов в качестве параметров построения отчёта нужно заполнить массив идентификаторамми данных объектов типа Guid;void ITabServiceProvider.UpdateActiveTabPageTitle(string title);
Метод позволяет обновить заголовок активной вкладки.
где:
title - старый заголовок вкладки;Интерфейс используется для сохранения состояния вкладок, принадлежащих модулю расширения, при выходе из приложения Pilot, а так же восстановления вкладок расширения и их состояния при последующем запуске приложения Pilot. Для примера реализации функционала сохранения и восстановления открытых вкладок расширения смотри пример OpenSpacePlugin из состава модулей SDK.
bool TrySaveTabState(Guid tabId, out Guid extensionId, out string state, out string tabTitle);
Метод, позволяющий сохранить состояние вкладки, если она принадлежит модулю расширения. Вызывается клиентом Pilot непосредственно перед закрытием. В этот момент модуль расширения может проверить, принадлежит ли ему вкладка с указанным идентификатором, и если да, передать информацию, которая может быть использована для восстановления данной вкладки расширения после перезапуска. Должен возвращать true в случае, если вкладка с указанным идентификатором принадлежит данному модулю расширения (если он её ранее создавал), и если данную вкладку необходимо будет автоматически открыть заново, когда клиент Pilot будет запущен вновь. В случае, если вкладка с указанным идентификатором не принадлежит модулю расширения, либо не должна быть сохранена для последующего восстановления, метод должен вернуть начение false.
где:
tabId - идентификатор вкладки, которая открыта на момент выхода из приложения. Используется для утсановления факта принадлежности данной вкладки текущему модулю расширения;extensionId - идентификатор модуля расширения, который необходимо вернуть в клиент Pilot. С помощью данного идентификатора возможно будет принять решение, принадлежит ли сохраненное состояние вкладки данному модулю расширения на этапе запуска клиента Pilot;state - сериализованное в виде строки состояние вкладки, которое необходимо вернуть в клиент Pilot. Эта строка будет передана модулю расширения в момент запуска приложения для восстановлния состояния вкладки расширения;tabTitle - сзаголовок вкладки, который необходимо вернуть в клиент Pilot. Это заголовок будет использоваться при восстановлении вклдаки после запуска приложения до тех пор, пока модуль расширения не обновит его в соответсвии с внутренней логикой восстановления состояния;bool TryAddTabAndRestoreState(Guid extensionId, string state, Guid tabId);
Метод, который вызывается клиентом Pilot при запуске и восстановлении набора сохраненных ранее вкладок. В этот момент модуль расширения должен проверить, совпадает ли идентификатор расширения, с которым модуль сохраняет состояниес своих вкладок, с идентификатором, который передан из клиента Pilot. Если идентификаторы совпадают и модуль успешно восстановил состояние вкладки, метод должен вернуть значение true. Если же информация о состоянии вкладки не принадлежит данному модулю, либо логика не позволяет восстановить данную вкладу, модуль должен вернуть занчение false.
extensionId - идентификатор расширения, который был использован при сохранении состояния вкладки;state - сериализованная в виде строки информация, которая позволяет восстановить состояние вкладки;tabId - идентификатор пустой вкладки, которая подготовлена системой Pilot, для замещения восстановленной версией вкладки модуля расширения. Метод ITabServiceProvider.UpdateTabPageContent должен быть использован для того, чтобы показать вновь созданную модулем расширения вкладку взамен текущей пустой вкладки с переданным идентификатором.Интерфейс предоставляет работу со встроенными диалоговыми и всплывающими окнами клиента Pilot-ICE/ECM. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
tring AccentColor { get; }
Возвращает текущий главный (акцентный) цвет приложения.
ThemeNames Theme { get; }
Возвращает текущую схему приложения.
void ShowSharingSettingsDialog(IEnumerable<Guid> objectIds);
Метод показывает диалог управления общим доступом к элементам.
где:
objectIds - список выбранных идентификаторов элементов.IEnumerable<IOrganisationUnit> ShowPositionSelectorDialog(IPilotDialogOptions options = null);
Метод показывает диалог выбора пользователей и должностей.
где:
options - настройки диалога.Диалог возвращает список выбранных должностей и пользователей.
IEnumerable<IDataObject> ShowDocumentsSelectorDialog(IPilotDialogOptions options = null);
Метод показывает диалог выбора элементов из обозревателя проектов.
где:
options - настройки диалога.IEnumerable<IDataObject> ShowDocumentsSelectorDialogAndNavigate(Guid parentId, IPilotDialogOptions options = null);
Метод показывает диалог выбора элементов из обозревателя проектов (с навигацией в указанную параметром папку).
где:
parentId - идентификатор родительского элемента, навигация в который будет выполнена при открытии диалога.options - настройки диалога.IEnumerable<IDataObject> ShowDocumentsSelectorByObjectTypeDialog(IEnumerable<int> objectTypeIds, IPilotDialogOptions options = null);
Метод показывает диалог выбора элементов указанного типа из обозревателя проектов.
где:
objectTypeIds - Id типов, которые могут быть выбраныoptions - настройки диалога.IEnumerable<IDataObject> ShowDocumentsSelectorByObjectTypeDialogAndNavigate(IEnumerable<int> objectTypeIds, Guid parentId, IPilotDialogOptions options = null);
Метод показывает диалог выбора элементов указанного типа из обозревателя проектов (с навигацией в указанную параметром папку).
где:
objectTypeIds - Id типов, которые могут быть выбраныparentId - идентификатор родительского элемента, навигация в который будет выполнена при открытии диалога.options - настройки диалога.IEnumerable<IDataObject> ShowTasksSelectorDialog2(IPilotDialogOptions options = null);
Метод показывает диалог выбора заданий.
где:
options - настройки диалога.IEnumerable<IDataObject> IPilotDialogService.ShowReferenceBookDialog(string referenceBookConfiguration, string serializationId = null, IPilotDialogOptions options = null);
Метод показывает диалог выбора элементов из строкового справочика
где:
referenceBookConfiguration - строка конфигурации справочника (может быть получена из дополнительных параметров соответсвующего атрибута);serializationId - идентификатор, использующийся для сохранения и восстановления состояния диалога (список развернутых узлов дерева);options - дополнительные параметры показа диалога;IEnumerable<IDataObject> IPilotDialogService.ShowElementBookDialog(string elementBookConfiguration, string serializationId = null, IPilotDialogOptions options = null);
Метод показывает диалог выбора элементов для атрибута Справочник элементов
где:
elementBookConfiguration - строка конфигурации справочника элементов (может быть получена из дополнительных параметров соответсвующего атрибута);serializationId - идентификатор, использующийся для сохранения и восстановления состояния диалога (список развернутых узлов дерева);options - дополнительные параметры показа диалога;void ShowTaskDialog(int taskTypeId, IObjectModifier modifier, IPilotDialogOptions options = null);
Метод показывает диалог задания с предустановленными изменениями из modifier.
где:
taskId - идентификатор объекта задания для которого нужно показать диалог;modifier - объект модификатора, с помощью которого можно вносить изменения в объект;options - дополнительные параметры показа диалога;void ShowEditTaskDialog(Guid taskId, bool isReadonly, DialogOptions options = null);
Метод показывает диалог редактирования задания
где:
taskId - идентификатор объекта задания для которого нужно показать диалог редактирования;isReadonly - флаг, который определяет, должна ли карточка задания быть показана в режиме только для чтения;options - дополнительные параметры показа диалога;void ShowObjectDialog(Guid parentId, int objectTypeId, IReadOnlyDictionary<Guid, INChange> changes, bool showDocumentPreview);
Метод показывает диалог создания нового объекта
где:
parentId - идентификатор родительского объекта, в детях которого должен быть создан новый объект;objectTypeId - тип создаваемого объекта;changes - предзаполненные изменения объекта. Поддерживается только предзаполнение атрибутов значниями, которые будут показаны в карточке объекта;showDocumentPreview - флаг, который указывает, показывать ли в диалоге создания объекта панель для добавлния документов;void ShowEditObjectDialog(Guid id, bool showDocumentPreview);
Метод показывает диалог редактирования карточки существующего объекта
где:
id - идентификатор объекта;showDocumentPreview - флаг, который указывает, показывать ли в диалоге создания объекта панель для добавлния документов;void ShowBalloon(string title, string message, PilotBalloonIcon icon);
Метод показывает всплывающее окно с заданным заголовком, текстом и иконкой.
где:
title - заголовок всплывающего окна;message - текст всплывающего окна;icon - иконка всплывающего окна;IPilotDialogOptions NewOptions();
Создает параметры диалога по умолчанию.
Задает значения, которые управляют схемой приложения.
Jedi
Светлая схема приложения.
Sith
Темная схема приложения.
Задает значения, которые определяют иконку всплывающего окна.
None
Иконка отсутствует.
Info
Иконка, которая характеризует вывод информационного сообщения во всплывающем окне.
Warning
Иконка, которая характеризует вывод предупреждения во всплывающем окне.
Error
Иконка, которая характеризует вывод ошибки во всплывающем окне.
Задает значения, которые определяют тип сообщения.
TextMessage
Текстовое сообщение.
ChatCreation
Сообщение создания чата.
ChatMembers
Сообщение редактирования участников чата: добавление/удаление/редактирование.
MessageRead
Сообщение о прочтении другого сообщения.
MessageAnswer
Сообщение-ответ на другое сообщение.
ChatChanged
Сообщение редактирования чата.
ChatRelation
Сообщение о добавлении связи.
MessageDropUnreadCounter
Сообщение сбросе счетчика непрочитанных сообщений.
EditTextMessage
Сообщение о редактировании другого сообщения.
Задает значения, которые определяют тип чата.
Personal
Чат для личной переписки.
Group
Групповой чат.
ObjectRelated
Чат по элементу.
Задает значения, которые определяют тип связи чата с объектом.
Relation
Связь
Attach
Вложение
Описывает сертификат
string Thumbprint
Уникальный идентификатор сертификата
DataTime ValidToDate
Дата окончания действия сертификата
DataTime ValidFromDate
Дата начала действия сертификата
string Issuer
Центр сертификации, выпустивший сертификат
string Subject
Субъект сертификата
string PublicKeyOid
Идентификатор алгоритма публичного ключа сертификата
Unknown
Неизвестная подпись.
NotCades
Не являющаяся Cades подпись.
CadesBes
Базовая подпись без штампов времени и ссылок на сертификаты.
CadesEpes
Добавляется политика подписи.
CadesT
Добавляется штамп времени.
CadesC
Добавляется полные значения сертификатов и CRL для самодостаточной проверки.
CadesXLT1
Добавляются ссылки на сертификаты и CRL, а также архивный штамп времени.
CadesXLT2
Добавляются полные значения сертификатов и CRL(как в CADES-C).
CadesA
Архивная подпись, включающая все необходимые данные для долговременной проверки подписи.
Интерфейс обеспечивает возможность подписываться на разные события возникающие в клиенте Pilot-ICE/ECM. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод подписывает заданного подписчика на события.
void IEventAggregator.Subscribe(object subscriber);
где:
subscriber - подписчик. Должен реализовывать один или несколько интерфейсов событийПример:
using Ascon.Pilot.SDK;
namespace EventSample
{
class EventSubscriber : IHandle<UnloadedEventArgs>, IHandle<LoadedEventArgs>
{
private readonly IEventAggregator _eventAggregator;
public EventSubscriber(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}
public void Handle(UnloadedEventArgs message)
{
//TODO do something when unloading extension
}
public void Handle(LoadedEventArgs message)
{
//TODO do something when loading extension
}
}
}
В примере показано как можно подписаться на события загрузки и выгрузки расширения.
Метод отписывается от ранее подписанных событий;
void IEventAggregator.Unsubscribe(object subscriber);
где:
subscriber - подписчик. Должен реализовывать один или несколько интерфейсов событий.Интерфейс для получения информации о состоянии подключения к Pilot-Server
Метод, определяющий, установлено ли соединение клиента с Pilot-Server
bool IsOnline();
Подписка на изменение состояния подключения клиента с Pilot-Server
IObservable<bool> Subscribe();
Интерфейс служит для встраивания карточки объекта Pilot в интерфейс расширений. Может использоваться как для отображения карточки уже существующего объекта, так и для того, чтобы показать карточку создания нового объекта заданного типа. Получить этот интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
GetObjectCardControl Метод используется для получения элементов отображения и управления карточкой объекта. Возвращает объект типа ObjectCardControl, который предоставляет два свойства: котрол типа FrameworkElement, который при встраивании в визуальное дерева расширения отображает карточку объекта; и объект типа IObjectCardControlInteraction, который используется для управления карточкой: получение введеных пользователем значений атрибутов, переход в режим только для чтения, и других возможностей.
Метод имеет два варианта перегрузки для встраивания карточки либо в режиме создания нового объекта, либо в режиме редактирования существующего объекта. Встраивание карточки в режиме создания нового объекта осуществляется при помощи следующего варианта метода:
ObjectCardControl GetObjectCardControl(
Guid newObjectId,
IType newObjectType,
Guid parentObjectId,
IDictionary<string, object> initAttributes);
где:
newObjectId - идентификатор, который будет назначен новому объекту после создания;newObjectType - тип нового объекта;parentObjectId - идентификатор родительского объекта, в детях которого будет создан новый объект;initAttributes - список предопределенных значений атрибутов, которыми будет инициализирована карточка нового объекта;Встраивание карточки в режиме редактирования существующего объекта осуществляется другим вариантом метода:
ObjectCardControl GetObjectCardControl(Guid objectId, bool isReadonly);
где:
objectId - идентификатор объекта, для которого будет показана карточка;isReadonly - флаг, который управляет тем, будет ли карточка показана в режиме только для чтения.;Служит для взаимодействия расширения с карточкой объекта, которая была встроена с помощью метода GetObjectCardControl интерфейса IObjectCardControlProvider.
OnObjectCardUpdated Событие, которое позволяет отслеживать момент изменения значения атрибутов в карточки объекта.
event EventHandler OnObjectCardUpdated
GetIsChildDialogOpen Возвращает true, если в настоящий момент остаётся открытым дочерний диалог, который был вызван из карточки объекта. Например, диалог выбора организационных единиц.
bool GetIsChildDialogOpen();
GetIsValidInput Позволяет узнать, являются ли все введеные значения атрибутов в карточке валидными.
bool GetIsValidInput();
GetIsDataChanged Возвращает true, если значение хотя бы одного атрибута было изменено.
bool GetIsDataChanged();
GetValues Используется для получения текущих значений атрибутов в карточке объекта.
IDictionary<string, ObjectCardValue> GetValues();
SetIsReadOnly Устанавливает значение фалага, который определяет, находится ли карточка объекта в режиме только для чтения.
void SetIsReadOnly(bool value);
HideCreatedByInfo Скрывает строку в интерфейсе карточки, которая отображает автора и время создания объекта.
void HideCreatedByInfo();
UseCompactScrollbar Переключает карточку в режим использования компактного вертикального скроллбара.
void UseCompactScrollbar();
Интерфейс обеспечивает возможность встроить элемент пользовательского интерфейса “Чаты” в интерфейс расширений. Получить этот интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод позволяет получить элемент пользовательского интерфеса отвечающий за работу чатов привязанных к заданному элементу,
ChatControl GetObjectChatsControl(Guid objectId, IChatControlsOptions options = null);
где:
objectId - идентификатор элемента, к которому привязана переписка (чат).options - дополнительные настройки элемента “Чаты”.Возвращает объект типа ChatControl, который предоставляет два свойства: объект типа FrameworkElement, который отображает элемент интерфейса “Чаты” и интерфейс IChatControlsInteraction, который используется для взаимодействия с с ним.
Метод создания дополнительных настроек элемента “Чаты”.
IChatControlsOptions NewChatControlOptions();
Интерфейс обеспечивает возможность настроить отображение элемента “Чаты”.
Метод позволяет задать видимость инофрмационной панели элемента “Чаты”
IChatControlsOptions WithShowChatInfo(bool value);
Метод позволяет задать видимость заголовка объекта по которому создан чат
IChatControlsOptions WithShowObjectCaption(bool value);
Интерфейс обеспечивает возможность зарегистрировать и получить сервисы определенного типа (включая зарегистрированные другими модулями). Получить этот интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод позволяет получить сервисы заданного типа.
IEnumerable<TService> GetServices<TService>();
где:
TService - тип сервиса.Метод позволяет зарегистрировать экземпляр сервиса заданного типа.
void Register<TService>(TService service);
где:
TService - тип сервиса;service - экземпляр сервиса заданного типа.Интерфейс позволяет управлять влкадкой с просмотрщиком документов. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод обновляет текущую вкладку с просмотрщиком документов.
void UpdateDocumentPreview();
Каждый из пользовательских атрибутов может быть дополнен конфигурацией. Конфигурация представляет собой текстовое поле, с помощью которого могут быть заданы специальные настройки атрибута:
Для работы с конфигурацией атрибута можно использовать интерфейс IAttributeFormatParser, который предоставляет методы для десериализации настроек, хранящихся в строке конфигурации атрибута. Более полную информацию о форматировании атрибутов, нумераторах и справочниках смотри в справке к Pilot-ICE.
Пример Ascon.Pilot.SDK.ObjectsSample использует этот интерфейс для построения карточки объекта, включающей в себя отображение атрибутов, которым назначен нумератор, и атрибутов типа справочник; а так же для построения отоброжаемого имени объектов.
IAttributeFormatParserПозволяет работать с конфигурайией атрибутов: получать формат отображения атрибутов, а так же десериализованное описание нумераторов и справочников.
Для получения доступа к интерфейсу поиска его необходимо передать в конструктор. При этом конструктор необходимо пометить атрибутом [ImportingConstructor].
Осуществляет форматирование значениий атрибутов объекта в соответсвии с указанным форматом. Например, используется для получения отображаемого имени объекта. Строка форматирования может быть получена с помощью метода GetAttributeFormat, который описан ниже.
string objAttributesDisplayString = _parser.AttributesFormat(format, objectAttributes);
где:
objAttributesDisplayString - значение, полученное при применении приведенной строки форматирования к текущему состоянию объекта;_parser - экземляр объекта, реализующего интерфейс IAttributeFormatParser;format - приведенная строка форматирования атрибутов;objectAttributes - текущее состояние объекта: коллекция пар <ИмяАтрибута, ЗначениеАтрибута>;Возвращает строку форматирования атрибута на основе конфигурации атрибута.
string format = _parser.GetAttributeFormat(configuration);
где:
format - строка форматирования атрибутов объекта;_parser - экземляр объекта, реализующего интерфейс IAttributeFormatParser;configuration - строка конфигурации атрибута;Возвращает имя культуры, которая должна использоваться, при форматировании значения атрибута.
string culture = _parser.GetAttributeFormatCulture(configuration);
где:
culture - строка культуры форматирования арибутов объекта;_parser - экземляр объекта, реализующего интерфейс IAttributeFormatParser;configuration - строка конфигурации атрибута;Метод для получения десериализованного описания нумераторов из строки конфигурации атрибута. Возвращает true, если строка конфигурации содержит описание нумераторов и его удалось успешно десериализовать; false в обратном случае.
IEnumerable<INumeratorInfo> numeratorsCollection;
bool success = _parser.TryParseNumeratorDeclaration(configuration, out numeratorsCollection);
где:
success - результат успешной десериализации описания нумераторов из приведенной строки конфигурации атрибута;_parser - экземляр объекта, реализующего интерфейс IAttributeFormatParser;configuration - строка конфигурации атрибута;numeratorsCollection - коллекция десериализованных описаний нумераторов, содержавшихся в приведенной строке конфигурации;Применяет нумератор к текущему состоянию объекта и возвращает строку, которая может использоваться для предпросмотра значения атрибута, которое будет назначено сервером при создании объекта и применения к нему нумератора. Используется для визуализации значения атрибута в карточке создания нового объекта, которое будет назначено сервером.
string attributeValuePreview = _parser.PreviewNumeratorFormat(configuration, objectAttributes);
где:
attributeValuePreview - значение атрибута, которое будет получено на стороне сервера, при применении нумератора к текущему состоянию;объекта;
configuration - строка конфигурации нумератора;objectAttributes - текущее состояние объекта: коллекция пар <ИмяАтрибута, ЗначениеАтрибута>;Метод для получения десериализованного описания справочника из строки конфигурации атрибута. Возвращает true, если строка конфигурации содержит описание справочника и его удалось успешно десериализовать; false в обратном случае.
IReferenceBookConfiguration referenceBookConfiguration;
bool success = _parser.TryParseReferenceBookConfiguration(configuration, out referenceBookConfiguration);
где:
success - результат успешной десериализации описания справочника из приведенной строки конфигурации атрибута;_parser - экземляр объекта, реализующего интерфейс IAttributeFormatParser;configuration - строка конфигурации атрибута;referenceBookConfiguration - десериализованное описание справочника, содержавшееся в приведенной строке конфигурации;Метод для получения десериализованного описания атрибута Справочник элементов. Возвращает true, если строка конфигурации содержит описание справочника и его удалось успешно десериализовать; false в обратном случае.
IElementBookConfiguration elementBookConfiguration;
bool success = _parser.TryParseElementBookConfiguration(configuration, out elementBookConfiguration);
где:
success - результат успешной десериализации описания справочника из приведенной строки конфигурации атрибута;_parser - экземляр объекта, реализующего интерфейс IAttributeFormatParser;configuration - строка конфигурации атрибута;elementBookConfiguration - десериализованное описание справочника, содержавшееся в приведенной строке конфигурации. Интерфейфс IElementBookConfiguration;Метод для получения десериализованного описания состояния из строки конфигурации атрибута. Возвращает true, если строка конфигурации содержит описание состояния и его удалось успешно десериализовать; false в обратном случае.
IUserStateConfiguration userStateConfiguration
bool success = _parser.TryParseUserStateConfiguration(configuration, out userStateConfiguration);
где:
success - результат успешной десериализации описания состояния из приведенной строки конфигурации атрибута;_parser - экземляр объекта, реализующего интерфейс IAttributeFormatParser;configuration - строка конфигурации атрибута;userStateConfiguration - десериализованное описание состояния, содержавшееся в приведенной строке конфигурации;
Свойство для получаения префикса, указывающего, что значение данного атрибута нумератора требует отложенной регистрации.
Описание нумератора.
Отображаемое имя нумератора.
Конфигурация нумератора, используется как параметр метода PreviewNumeratorFormat, для получения предпросмотра значния атрибута, к которому применяется нумератор.
Конфигурация справочника, которая описывает его тип, поведение и правила формирования списка его элементов.
Свойство типа RefBookKind, определяет тип справочника.
Свойство, которое определяет коллекцию элементов справочника, если свойство Kind имеет значение RefBookKind.Enum.
Идентификатор объекта базы данных, дочерние объкты которого являются элементами справочника, если свойство Kind имеет значение RefBookKind.Object.
Список имен типов, из объектов которого должны формироваться элементы справочника, если свойство Kind имеет значение RefBookKind.Object. Если имен список пуст, то в формировании элементов справочника учавствуют дочерние элементы любого типа.
Определяет, имеет ли пользователь возможность вручную отредактировать значение выбранного из элементов справочника. Если свойство имеет значение false, то редактор атрибута не допускает ручной ввод значений, и значение атрибута может быть лишь выбрано из списка. В противном случае, пользователь может вводить значение атрибута вручную, а список элементов справочника используется как список значений для быстрого заполнения.
Определяет, добавлять ли связь нового объекта с выбранным из справочника элементом. Если свойство имеет значение false, то при выборе элемента из справочника задается значение атрибута объекта, при этом свзяь между объектом и элементом справочника не создается. В противном случае наряду с заданием значения атрибута будет создана связь между объектом и выбранным элементом справочика.
Строка форматирования, которая должна использоваться для формирования значения атрибута, при выборе элемента справочника.
Флаг, определяет доступен ли мультивыбор в диалоге выбора справочника или нет.
Указывает тип справочника, то есть один из возможных вариантов заполнения списка возможных значений справочника.
RefBookKind.Enum;
Справочник, элементами которого является предопределенный набор строковых значений. Смотри свойство Values интерфеса IReferenceBookConfiguration.
RefBookKind.Object;
Справочник, элементами которого являются дочерние элементы определенного объекта в базе данных. Этот объект определяется идентификатором, значение которого возвращается свойством Source интерфеса IReferenceBookConfiguration.
RefBookKind.OrgUnit;
Справочник, который предоставляет выбор элементов оргструктуры базы данных.
RefBookKind.Type;
Справочник, который предоставляет выбор типов из базы данных.
Указывает тип редактора, который должен использоваться для редактирования значения атрибута, для которого назначен справочник.
RefBookEditorType.Dialog;
Редактор атрибута должен представлять собой поле ввода с кнопкой, которая вызывает новый диалог для выбора значений из элементов справочника.
RefBookEditorType.ComboBox;
В качестве редактора значения атрибута должен использоваться комбобокс, выпадающий список которого состоит из элементов справочника.
Конфигурация атрибута Справочник элементов
Интерфейс IElementBookDescription с основными свойствами атрибута Справочник элементов.
Интерфейс IElementBookAutoFill с описанием автозаполнения атрибута Справочник элементов.
Контейнер с основными свойствами атрибута Справочник элементов.
Идентификатор объекта базы данных, дочерние объкты которого являются элементами справочника.
Список имен типов, из объектов которого должны формироваться элементы справочника. Если имен список пуст, то в формировании элементов справочника учавствуют дочерние элементы любого типа.
Определяет, доступен ли мультивыбор в диалоге выбора справочника или нет.
Строка форматирования, которая должна использоваться для формирования значения атрибута, при выборе элемента справочника.
Определяет, будет ли показан атрибут в списке элементов.
Определяет, будет ли активен атрибут в списке элементов.
Определяет, добавлять ли связь к объекту с выбранным элементом из справочника.
Определяет, следует ли заполнять поля атрибутов, совпадающих по имени с указанными в справочнике.
Контейнер с описанием автозаполнения атрибута Справочник элементов. Для получения результата автозаполнения используйте интерфейс IElementBookAutoFillWorker.
Определяет, на какое событие срабатывает автозаполнение.
Определяет, откуда будет взято значение для автозаполнения.
Если в ValueSource указано AutoFillValueSource.Parent, то значение для заполнения будет взято у первого родителя вложения, соответствующего типу из списка.
Определяет, откуда будет взято значение для автозаполнения атрибута Справочник элементов
Значением атрибута будет один из родителей вложения (по умолчанию).
Конфигурация состояния.
Идентификатор машины состояний, к которой относится атрибут.
Для заполнения атрибута типа нумератор при создании объекта необходимо:
Получить метаданные атрибута создаваемого объекта. IDataObject.Type.Attributes -> найти по имени (или другому признаку) нужный атрибут;
Получить значение поля IAttribute.Configuration и распарсить его. Поле должно содержать описание возможных строк формата данного атрибута. Ниже приведен наиболее сложный пример такого описания:Входящий документ, ВХ-{Counterc11cbdead2d047399127798d2d1ea07f:d5}-{CurrentDate:yyyy}Исходящий документ, ИС-{Counterc11cbdead2d047399127798d2d1ea07f:d5}-{CurrentDate:yyyy}
Строками разделены различные возможные описания нумератора. Таких строк может быть 1 или более. Каждая строка содержит следующие данные, разделенные между собой знаком ",":
Из распарсенных данных из пункта 2 выбираем нужное нам описание (если оно одно, то без выбора) и получаем значение его строки форматирования. Например, из вышеприведенного примера мы выберемИС-{Counterc11cbdead2d047399127798d2d1ea07f:d5}-{CurrentDate:yyyy}
Присваиваем значению атрибута создаваемого объекта значение строки форматирования из пункта 3. Описание нумератора также содержит флаг IsDeferredRegistration, который указывает на то, является ли нумертор отложенным. В таком случае, чтобы создать объект со отложенной регистрацией нумератора, нужно присвоить значению атрибута значние строки форматирования из пункта 3. с префиксом отложенной регистрации. Значение этого префикса можно получить используя свойство IAttributeFormatParser.DeferredNumeratorAttributeValuePrefix
Создаем объект, после прохождения объекта через сервер атрибут будет заполен согласно выбранной строке форматирования.
Пример:
using System.Linq;
using System.Text;
using Ascon.Pilot.SDK;
using Ascon.Pilot.SDK.DataObjectWrappers;
using Ascon.Pilot.SDK.Menu;
using NumeratorPlugin.Wrappers;
namespace NumeratorPlugin
{
[Export(typeof(IMenu<ObjectsViewContext>))]
public class MainModule : IMenu<ObjectsViewContext>
{
private readonly IObjectsRepository _repository;
private readonly IObjectModifier _modifier;
private readonly IAttributeFormatParser _attributeFormatParser;
private const string CREATE_COMMAND = "CreateCommand";
[ImportingConstructor]
public MainModule(IObjectsRepository repository, IObjectModifier modifier, IAttributeFormatParser attributeFormatParser)
{
_repository = repository;
_modifier = modifier;
_attributeFormatParser = attributeFormatParser;
}
public void Build(IMenuBuilder builder, ObjectsViewContext context)
{
builder.AddItem(CREATE_COMMAND, 0).WithHeader("Create element with numerator");
}
public void OnMenuItemClick(string name, ObjectsViewContext context)
{
const string typeName = "DocumentTypeWithNumerator";
const string attributeName = "NumeratorAttribute";
var type = _repository.GetType(typeName);
var numberAttribute = type.Attributes.First(att => att.Name == attributeName);
if (_attributeFormatParser.TryParseNumeratorDeclaration(numberAttribute.Configuration2(), out var numInfos))
{
var parent = context.SelectedObjects.FirstOrDefault();
foreach (var ni in numInfos)
{
var value = ni.IsDeferredRegistration
? $"{_attributeFormatParser.DeferredNumeratorAttributeValuePrefix}{ni.Configuration}"
: ni.Configuration;
_modifier.Create(parent, type).SetAttribute(attributeName, value);
}
}
_modifier.Apply();
}
}
}
Каждый из пользовательских типов может быть дополнен конфигурацией. Конфигурация представляет собой текстовое поле, с помощью которого могут быть заданы специальные настройки типа.
Для работы с конфигурацией типа можно использовать интерфейс ITypeConfigurationParser, который предоставляет методы для десериализации настроек, хранящихся в конфигурации типа.
ITypeConfigurationParserПозволяет работать с конфигурайией типов.
Для получения доступа к интерфейсу его необходимо передать в конструктор. При этом конструктор необходимо пометить атрибутом [ImportingConstructor].
Метод для получения десериализованного описания видов замечаний из конфигурации типа. Возвращает true, если строка конфигурации содержит описание видов замечаний и его удалось успешно десериализовать; false в обратном случае.
IRemarksConfiguration remarksConfiguration;
bool success = parser.TryParseRemarksConfiguration(configuration, out remarksConfiguration);
где:
success - результат успешной десериализации;parser - экземляр объекта, реализующего интерфейс ITypeConfigurationParser;configuration - конфигурация типа;remarksConfiguration - объект описывающий виды замечаний из конфигурации типа;Конфигурация видов замечаний
IList<RemarkKind> Kinds { get; }
Свойство, которе содержит список видов замечаний у заданного типа замечания. См RemarkKind
Тип содержит описание видов замечаний из конфигурации типа.
public RemarkKind(string colorHex, string kind)
где:
colorHex - цвет замечания в HEX (например #FFFFDABA);kind - вид замечания;public string ColorHex { get; }
Свойство возвращает цвет замечания в HEX ;
public string Kind { get; }
Свойство возвращает вид замечания.
Интерфейс для работы с атрибутом типа Состояние.
Метод для получения доступных переходов машины состояний.
IEnumerable<INumeratorInfo> transitions = _transitionManager.GetAvailableTransitions(attribute, attributes, person);
где:
transitions - список доступных переходов машины состояний;attribute - тип атрибута Состояние;attributes - значение атрибута Состояние; person - пользователь, для которого будут посчитаны доступные переходы;Метод для получения начального положения машины состояний.
Guid stateId = _transitionManager.GetStartingState(attribute);
где:
stateId - идентификатор состояния;attribute - тип атрибута Состояние;Вычисляет, доступен ли переход в состояние.
bool result = _transitionManager.IsTransitionAvailable(transition, attributes, person);
где:
result - результат;transition - объект типа ITransition;attributes - значение атрибута Состояние; person - пользователь, для которого будут посчитаны доступные переходы;Интерфейс содержит логику автозаполнения атрибута Справочник элементов. Описание настройки автозаполнения – IElementBookAutoFill.
Для получения доступа к интерфейсу его необходимо добавить как параметр в конструктор класса плагина. При этом конструктор необходимо пометить атрибутом [ImportingConstructor].
Вычисляет значение атрибута Справочник элементов с помощью настройки автозаполнения.
string[] result = await _autoFill.ComputeElementBookValueAsync(configuration, triggerObjectId);
где:
configuration - конфигурация атрибута;triggerObjectId - идентификатор вложения;Общие настройки представляют собой персонифицированное хранилище типа “ключ-значение”, где ключ - название настройки, а значение - ее значение. Список ключей системных настроек описан в классе SystemSettingsKeys. Данные хранилища общих настроек синхронизируются с сервером. Значения настроек могут быть записаны как для конкретного пользователя, так и для элемента организационной структуры, причем настройки, записанные для конкретного пользователя, имеют приоритет перед настройками для элемента организационной структуры, в который входит должность, на которой состоит пользователь.
Интерфейс ISettingsFeature позволяет зарегистрировать в диалоге общих настроек новый ключ. Класс, реализующий данный интерфейс, должен быть помечен атрибутом [Export(typeof(ISettingsFeature))].
Ключ настройки.
Отображаемое имя настройки.
Визуальный элемент, используемый для редактирования настроек данного типа.
Данный метод вызывается со стороны приложения перед показом Editor и позволяет получить объект ISettingValueProvider для редактирования значения настройки.
где:
settingsItemValue - значение настройки;Данный метод валидации вызывается со стороны приложения после клика по кнопке “Ок” в диалоге добавления/редактирования общей настройки, в случае возвращения true настройка сохраняется, в противном случае диалог остается открытым.
Импортируемый интерфейс, позволяющий получать значение настроек и менять значения настроек текущего пользователя.
Подписка на значение настройки по передаваемому ключу.
Изменение значения настройки по ключу.
Получение значения персональной настройки для текущего пользователя по ключу.
Получение по ключу списка значений настройки для всех элементов оргструктуры, в которые входит текущий пользователь.
Позволяет получать и устанавливать значение настройки для диалога общих настроек.
Получение текущего значения настройки.
Установка значения настройки.
Класс SystemSettingsKeys описывает ключи системных общих настроек.
Список избранного в обозревавателе документов.
Предпочтительная буква монтирования диска Pilot-Storage.
Список ролей для согласования.
Список смонтированных проектов.
Список расширений файлов на Pilot-Storage, для которых будет работать функционал автоблокировки.
Настройки автозаполнения полей файлов.
Поисковая система Pilot предоставляет богатый язык запросов. Построение запросов осуществляется с помощью конструкторов запросов (IQueryBuilder). Поиск можно осуществлять как по полям объектов так и по ключевому слову или части слова (фразы). Основными элементами языка запросов являются так называемые “условия поиска“.
Чтобы осуществить поиск необходимо:
Конструкторы запросов имеют три ключевых метода для построения поисковых запросов:
Must - заданное условие обязательно должно выполниться.MustAnyOf - должно выполняться одно из заданных условий.MustNot - заданное условие не должно выполниться.Чтобы задать поиск по определенному полю объекта используйте условия поиска для объектов ObjectFields и конструктор запросов для объектов (см GetObjectQueryBuilder)
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.TypeId.BeAnyOf(16,17));
Для любых объектов в базе Pilot предусмотрен поиск по ключевым словам. Такой поиск осуществляется с помощью “условия поиска AllText”.
Поиск по ключевому слову:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.AllText.Be("Проект*"));
Поиск по ключевым словам поддерживает одиночный (?) и многократный (*) подстановочные символы.
Для поиска с использованием одного символа подстановки используется служебный символ ?. Например, чтобы найти слова “test” и “text” вы можете использовать следующую запись:
ObjectFields.AllText.Be("te?t")
Для поиска с использованием многократного символа подстановки используется служебный символ *. Например, чтобы найти слова “test”, “tests” или “tester” вы можете использовать следующую запись:
ObjectFields.AllText.Be("test*")
Также есть возможность использования символа многократной подстановки в середине или в начале слова. Например:
ObjectFields.AllText.Be("te*t")
ВНИМАНИЕ!
Не рекомендуется использовать подстановочные символы в начале слова. Это приведет к полному перебору поисковых индексов, что может привести к сильным задержкам выдачи результата.
Интерфейс работы с поисковыми запросами.
Для получения доступа к интерфейсу поиска его необходимо добавить как параметр в конструктор класса плагина. При этом конструктор необходимо пометить атрибутом [ImportingConstructor].
Чтобы осуществить поиск объектов необходимо предварительно составить поисковый запрос с помощью выбранного конструктора запроса. После задания условий в конструкторе запросов с помощью условий поиска, его необходимо передать как параметр в метод Search. Существует четыре типа конструкторов поисковых запросов:
С помощью этого метода осуществляется поиск объектов по заданным критериям в конструкторе запросов. Результатом вызова этого метода является поставщик push-уведомлений результатов поиска cм. ISearchResult.
IObservable<ISearchResult> Search(IQueryBuilder query);
Метод запускает обновляемый поиск. По обновляемому поиску будут приходить нотификации каждый раз, когда будет изменяться результат поисковой выборки. Результатом вызова этого метода является поставщик push-уведомлений результатов поиска cм. ISearchResult.
ВНИМАНИЕ!
Обновляемые поисковые запросы создают дополнительную нагрузку на сервер, должны использоваться только при необходимости и в случае потери интереса к результатам обновляемого поиска требуется выполнить отписку через Dispose Observable коллекции.
IObservable<ISearchResult> RunRefreshableSearch(IQueryBuilder query);
Метод получения предварительно сконфигурированного конструктора запросов для пользовательских объектов.
В результат поисковой выдачи не попадают:
IQueryBuilder ISearchService.GetObjectQueryBuilder();
Метод получения простого конструктора запросов. Это универсальный конструктор запросов без предварительных условий. Этот конструктор можно использовать для поиска любых объектов в базе, включая объекты системных типов, например файл или папка на Pilot-Storage.
IQueryBuilder ISearchService.GetEmptyQueryBuilder();
Метод получения конструктора строки запроса для умной папки.
ISmartFolderQueryBuilder ISearchService.GetSmartFolderQueryBuilder();
Метод получения конструктора строки запроса для поиска по замечаниям.
IAnnotationQueryBuilder ISearchService.GetAnnotationQueryBuilder();
Метод получения поискового запроса с помощью синтаксиса поисковой грамматики поиска по заданиям.
IQueryBuilder ISearchService.GetQueryBuilderFromTaskSearchExpression(string expression, bool invariantCulture, bool nonPersonalFilter);
где:
expression - поисковое выражение в синтаксисе поисковой грамматики поиска по заданиям.invariantCulture - флаг, определяющий, будет ли использоваться инвариантная культура при парсинге поискового выражения (true для сериализованных выражений, например, фильтров по заданиям из общих настроек).nonPersonalFilter - флаг, определяющий, будет ли поиск ограничиваться результатами, относящимися к заданиям текущего пользователяМетод получения поискового запроса с помощью синтаксиса поисковой грамматики поиска в обозревателе документов.
IQueryBuilder ISearchService.GetQueryBuilderFromDocumentExplorerSearchExpression(string expression, bool invariantCulture);
где:
expression - поисковое выражение в синтаксисе поисковой грамматики поиска по обозревателю документов.invariantCulture - флаг, определяющий, будет ли использоваться инвариантная культура при парсинге поискового выражения (true для сериализованных выражений, например, выражений умных папок).Интерфейс создания поискового запроса умной папки.
Задает режим поиска (по атрибутам или по файлам)
ISmartFolderQueryBuilder WithSearchMode(SearchMode searchMode);
где:
searchMode - режим поиска.Задает ключевое слово для поиска
ISmartFolderQueryBuilder WithKeyword(string keyword);
где:
keyword - ключевое слово.Задает ключевое слово для точного поиска.
ISmartFolderQueryBuilder WithQuotedKeyword(string keyword);
где:
keyword - ключевое слово.Задает тип элемента для поиска.
ISmartFolderQueryBuilder WithType(int typeId);
где:
typeId - идентификатор типа.Задает список типов элементов для поиска.
ISmartFolderQueryBuilder WithTypes(IEnumerable<int> typeIds);
где:
typeIds - список идентификаторов типов.Задает состояние элементов для поиска.
ISmartFolderQueryBuilder WithState(ObjectState state);
где:
state - состояние объекта.Задает автора (создателя) элемента для поиска.
ISmartFolderQueryBuilder WithAuthor(int authorId);
где:
authorId - идентификатор пользователя.Задает авторов (создателей) элементов для поиска.
ISmartFolderQueryBuilder WithAuthors(IEnumerable<int> authorIds);
где:
authorIds - список идентификаторов пользователя.Задает время создания элементов “сегодня” для поиска.
ISmartFolderQueryBuilder WithCreatedToday();
Задает время создания элементов “вчера” для поиска.
ISmartFolderQueryBuilder WithCreatedYesterday();
Задает время создания элементов “на этой неделе” для поиска.
ISmartFolderQueryBuilder WithCreatedThisWeek();
Задает время создания элементов “на прошлой неделе” для поиска.
ISmartFolderQueryBuilder WithCreatedLastWeek();
Задает время создания элементов “в этом месяце” для поиска.
ISmartFolderQueryBuilder WithCreatedThisMonth();
Задает время создания элементов “в прошлом месяце” для поиска.
ISmartFolderQueryBuilder WithCreatedLastMonth();
Задает время создания элементов “в этом году” для поиска.
ISmartFolderQueryBuilder WithCreatedLastYear();
Задает время создания элементов “в прошлом году” для поиска.
ISmartFolderQueryBuilder WithCreatedThisYear();
Задает диапазон дат создания элементов для поиска.
ISmartFolderQueryBuilder WithCreatedInRange(DateTime fromUtc, DateTime toUtc);
где:
fromUtc - начальная дата в UTC.toUtc - конечная дата в UTC.Преобразует поисковый запрос в строку для последующего сохранения ее в соответствующем атрибуте умной папки
string ToString();
using Ascon.Pilot.SDK;
namespace SmartFolderSample
{
[Export(typeof(IDataPlugin))]
public class SmartFolderSample : IDataPlugin
{
private readonly ISearchService _searchService;
private readonly IObjectsRepository _repository;
private readonly IObjectModifier _modifier;
[ImportingConstructor]
public SmartFolderSample(ISearchService searchService, IObjectsRepository repository, IObjectModifier modifier)
{
_searchService = searchService;
_repository = repository;
_modifier = modifier;
}
public void CreateSmartFolder(IDataObject parent)
{
_modifier.Create(parent, GetSmartFolderType())
.SetAttribute(SystemAttributeNames.SMART_FOLDER_TITLE, "title")
.SetAttribute(SystemAttributeNames.SEARCH_CRITERIA, GetSmartFolderSearchString())
.SetAttribute(SystemAttributeNames.SEARCH_CONTEXT_OBJECT_ID, parent.Id.ToString());
_modifier.Apply();
}
private string GetSmartFolderSearchString()
{
var searchString = string.Empty;
var type = _repository.GetType("Project");
if (type == null)
return searchString;
var builder = _searchService.GetSmartFolderQueryBuilder();
builder.WithSearchMode(SearchMode.Attributes)
.WithType(type.Id)
.WithKeyword("5000").ToString();
searchString = builder.ToString();
return searchString;
}
private IType GetSmartFolderType()
{
return _repository.GetType(SystemTypeNames.SMART_FOLDER);
}
}
}
Интерфейс создания поискового запроса по замечаниям.
Задает ключевое слово для поиска
IAnnotationQueryBuilder WithKeyword(string keyword);
где:
keyword - ключевое слово.Задает ключевое слово для точного поиска.
IAnnotationQueryBuilder WithQuotedKeyword(string keyword);
где:
keyword - ключевое слово.Задает тип элемента для поиска.
IAnnotationQueryBuilder WithType(int typeId);
где:
typeId - идентификатор типа.Задает список типов элементов для поиска.
IAnnotationQueryBuilder WithTypes(IEnumerable<int> typeIds);
где:
typeIds - список идентификаторов типов.Задаёт поиск замечаний только по текущий версии документа (по умолчанию - поиск по всем версиям).
IAnnotationQueryBuilder WithCurrentVersion();
Универсальный интерфейс конструктора поисковых запросов.
Используйте этот метод для условий поиска, которые ДОЛЖНЫ быть в объектах.
IQueryBuilder Must(ISearchTerm term);
где:
term - условие поиска. (например: ObjectFields.AllText.Be(“Hello*”))Используйте этот метод, если какое-либо из указанных условий поиска ДОЛЖНО быть в объектах.
IQueryBuilder MustAnyOf(params ISearchTerm[] terms);
где:
terms - условия поиска. (например: ObjectFields.TypeId.BeAnyOf(new[] {1, 2, 3})).Используйте этот метод, если условие поиска НЕ ДОЛЖНО быть в объектах.
IQueryBuilder MustNot(ISearchTerm term);
где:
terms - условие поиска. (например: TaskFields.State.Be(State.None)).Используйте этот метод для того, чтобы установить поле и направление сортировки результатов поиска.
IQueryBuilder SortBy(INamedField field, ListSortDirection direction);
где:
field - поле, по которому необходимо отсортировать результаты поиска (Например: ObjectFields.TypeId).direction - направление сортировки.Используйте этот метод для того, чтобы ограничить количество результатов. Значение по умолчанию 250.
IQueryBuilder MaxResults(int result);
где:
result - максимальное количество результатов поиска.Используйте этот метод для того, чтобы установить контекст поиска.
IQueryBuilder InContext(Guid id);
где:
id - идентификатор объекта.Интерфейс предоставляет доступ к результатам поиска.
Список идентификаторов найденных объектов.
IEnumerable<Guid> Result { get; }
Общее количество найденных объектов. Так как поисковая выдача ограничена с помощью IQueryBuilder.MaxResults, в общем случае значение Total может быть больше количества результатов Result. Если требуется найти больше объектов, установите большее значение IQueryBuilder.MaxResults и перезапустите поиск.
long Total { get; }
Источник результата поиска.
SearchResultKind Kind { get; }
Источник результата поиска.
Результаты были получены из локального хранилища клиента.
SearchResultKind.Local
Результаты были получены с удаленного сервера.
SearchResultKind.Remote
Используйте это условие, чтобы задать поиск по определенному идентификатору объекта.
Например:
var id = new Guid("01A1028B-79BC-45C7-8A59-6191E8ADFE39");
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.Id.Be(id));
Используйте это условие, чтобы задать поиск по определенному идентификатору родительского объекта.
Например:
var id = new Guid("01A1028B-79BC-45C7-8A59-6191E8ADFE39");
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ParentId.Be(id));
Используйте это условие, чтобы задать поиск по типу объекта.
Например: зададим условие поиска для объектов типа 16 ИЛИ 17
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.TypeId.BeAnyOf(16,17));
Используйте это условие, чтобы задать поиск по состоянию объекта.
Например: зададим условие поиска для объектов в состоянии заморозка
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf(ObjectState.Frozen));
Дргугой пример, поиск объектов, находящихся в корзине:
var builder = _searchService.GetEmptyQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf(ObjectState.InRecycleBin));
Или наоборот: фильтрация объектов, помещенных в корзину, которые не должны отображаться в результатах поиска:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf(ObjectState.Frozen, ObjectState.Alive));
Дргугой пример: поиск заблокированных объектов
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf(ObjectState.LockRequested, ObjectState.LockAccepted));
Используйте это условие, чтобы задать поиск по создателю объекта.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.CreatorId.Be(25));
Используйте это условие, чтобы задать поиск по дате создания объектов. Дату и время необходимо задавать в формате UTC.
Например:
var builder = _searchService.GetObjectQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(ObjectFields.CreatedDate.BeInRange(fromDate, toDate));
Используйте это условие, чтобы искать скрытые или общедоступные объекты.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.IsSecret.Be(true));
Используйте это условие, чтобы искать объекты по слову или части слова. Поиск осуществляется по атрибутам объекта.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.AllText.Be("Проект*"));
Используйте это условие, чтобы искать объекты по дате создания версии файла (например, XPS документа или файла на Pilot-Storage).
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.SnapshotsCreated.BeInRange(from,to));
Используйте это условие, чтобы искать документы по причине создания версии (как актуальной, так и любой из предыдущих).
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.AllSnapshotsReason.Be("Обновлен*"));
Используйте это условие, чтобы искать документы, ожидающие подписания от одной или нескольких должностей.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.SignatureAwaitingBy.Be(gipPositionId));
Используйте это условие, чтобы искать документы, подписанные каким-либо пользователем.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.SignedBy.Be(gipPositionId));
Используйте это условие, чтобы искать объекты, заблокированные каким-либо пользователем.
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(ObjectFields.ObjectState.BeAnyOf(ObjectState.LockRequested, ObjectState.LockAccepted));
builder.Must(ObjectFields.StateChangedPersonId.Be(gipPersonId));
Используйте это условие, чтобы искать объекты по атрибуту типа строка.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(AttributeFields.String("AttributeName").Be("Искать*"));
Используйте это условие, чтобы искать объекты по атрибуту типа дата. Дату и время необходимо задавать в формате UTC.
Например:
var builder = _searchService.GetObjectQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(AttributeFields.DateTime("AttributeName").BeInRange(fromDate, toDate));
Используйте это условие, чтобы искать объекты по атрибуту типа вещественное число.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(AttributeFields.Double("AttributeName").Be(2.2));
Используйте это условие, чтобы искать объекты по атрибуту типа целое число.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(AttributeFields.Integer("AttributeName").Be(2));
Используйте это условие, чтобы искать объекты по атрибуту типа булевое значение.
Например:
var builder = _searchService.GetObjectQueryBuilder();
builder.Must(AttributeFields.Bool("AttributeName").Be(true));
Используйте это условие для точного поиска значения.
ISearchTerm Be(T value);
Например:
var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.ExecutorPositionId.Be(42));
Поиск значений удовлетворяющих одному из условий.
ISearchTerm BeAnyOf(params T[] values);
Например:
var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.ExecutorPositionId.BeAnyOf(45,42,15));
Поиск значений находящихся в заданном диапазоне значений.
ISearchTerm BeInRange(T from, T to);
Например:
var builder = _searchService.GetTaskQueryBuilder();
var fromDate = new DateTime(2016, 5, 5).ToUniversalTime();
var toDate = DateTime.Today.ToUniversalTime();
builder.Must(TaskFields.DateOfCompletion.BeInRange(fromDate, toDate));
Поиск значений соответствующих всем заданным условиям.
ISearchTerm ContainsAll(params T[] values);
Например:
var builder = _searchService.GetTaskQueryBuilder();
builder.Must(TaskFields.AllText.ContainsAll("задание", "согласование"));
using Ascon.Pilot.SDK;
namespace SearchSample
{
[Export(typeof(IDataPlugin))]
public class SearchSamplePlugin : IDataPlugin, IObserver<ISearchResult>
{
private readonly IObjectsRepository _repository;
private long _total;
[ImportingConstructor]
public SearchSamplePlugin(ISearchService searchService, IObjectsRepository repository)
{
_repository = repository;
var currentPerson = repository.GetCurrentPerson();
var fromDate = new DateTime(2016,1,1).ToUniversalTime();
var to = new DateTime(2016,12,31).ToUniversalTime();
//Построим запрос на поиск объектов:
// - созданные текущим пользователем
// - объекты только типа "Project"
// - созданные в 2016 году
// - сортировать результаты по дате создания. По возрастанию.
// - вывести только 50 результатов
var qBuilder = searchService.GetObjectQueryBuilder();
qBuilder.Must(ObjectFields.CreatorId.Be(currentPerson.Id))
.Must(ObjectFields.TypeId.Be(GetProjectTypeId()))
.Must(ObjectFields.CreatedDate.BeInRange(fromDate, to))
.SortBy(ObjectFields.CreatedDate, ListSortDirection.Ascending)
.MaxResults(50);
searchService.Search(qBuilder).Subscribe(this);
}
public void OnNext(ISearchResult value)
{
var items = value.Result;
_total = value.Total;
_repository.SubscribeObjects(items).Subscribe(SomeObjectsLoader);
}
public void OnError(Exception error)
{
}
public void OnCompleted()
{
}
private int GetProjectTypeId()
{
//Сработает только если в конфигурации базы данных присутствует тип с именем Project
var type = _repository.GetType("Project");
if (type == null)
throw new Exception("Type Project not found");
return type.Id;
}
}
}
В клиенте Pilot предусмотрена возможность взаимодействия расширений между собой. Т.е. любое расширение может вызвать команду другого расширения и использовать результат работы вызванной команды. Для того, чтобы разработчики смогли воспользоваться командой мы рекомендуем добавить описание входящих и исходящих параметров. Как сериализовать и десериализовать параметры и результат работы команды.
Интерфейс предназначен для реализации обработчика команды в расширении
Guid CommandId { get; }
Свойство возвращает уникальный идентификатор команды.
string Description { get; }
Свойство возвращает описание команды.
Чтобы разработчики сторонних расширений смогли воспользоваться вашими командами в описании команды необходимо описать формат входящих параметров и формат результата работы команды.
byte[] Handle (byte[] args);
где:
args - параметры командыМетод выполняет команду.
Интерфейс предназначен для получения информации о доступных командах в системе и вызове их.
Для получения доступа к интерфейсу вызова команд его необходимо добавить как параметр в конструктор класса плагина. При этом конструктор необходимо пометить атрибутом [ImportingConstructor].
IEnumerable<CommandDescription> GetAvailableCommands();
Метод возвращает описания доступных команд в системе.
byte[] Invoke (Guid commandId, byte[] args);
где:
commandId - уникальный идентификатор командыargs - параметры вызова команды.Метод позволяет вызвать команду из другого расширения. В случае отсутствия команды будет выброшено исключение типа CommandHandlerNotFoundException
Описание и результат выполнения команды смотрите спрашивайте у разработчиков расширений. Мы рекомендуем описывать команды и параметры в свойстве Description обработчика команды.
Тип описания команды расширения.
public CommandDescription(Guid commandId, string description)
где:
commandId - уникальный идентификатор командыdescription - подробное описание команды команды.public Guid CommandId { get; }
Свойство получает уникальный идентификатор команды
public string Description { get; }
Свойство получает подробное описание команды.
К данным интерфейсам относятся объекты, которые содержат информацию об элементах, пользователях, заданиях и т.п.
Интерфейс предназначен для просмотра информации об элементе.
Поле Id содержит идентификатор элемента.
Guid IDataObject.Id { get; }
Поле ParentId содержит идентификатор родительского элемента.
Guid IDataObject.ParentIdId { get; }
Поле Created содержит дату создания элемента.
DateTime IDataObject.Created { get; }
Поле Attributes содержит словарь атрибутов элемента. Где значением атрибута могут быть следующие типы: string, int, DateTime и double.
IDictionary<string, object> IDataObject.Attributes { get; }
Поле DisplayName содержит отображаемое имя элемента, собранное из доступных атрибутов по определенному правилу.
string IDataObject.DisplayName { get; }
Поле Type содержит тип элемента.
IType IDataObject.Type { get; }
Поле Creator содержит информацию о пользователе, создавшем текущий элемент.
IPerson IDataObject.Creator { get; }
Поле Children содержит список идентификаторов дочерних элементов.
ReadOnlyCollection<Guid> IDataObject.Children { get; }
Поле Relations содержит список всех связей элемента с другими элементами.
ReadOnlyCollection<IRelation> IDataObject.Relations { get; }
Поле RelatedSourceFiles содержит список идентификаторов элементов, связанных с текущим связью типа “Исходный файл”
ReadOnlyCollection<Guid> IDataObject.RelatedSourceFiles { get; }
Поле RelatedTaskInitiatorAttachments содержит список идентификаторов элементов, связанных с текущим связью типа “Вложение в задание от инициатора”
ReadOnlyCollection<Guid> IDataObject.RelatedTaskInitiatorAttachments { get; }
Поле RelatedTaskMessageAttachments содержит список идентификаторов элементов, связанных с текущим связью типа “Вложение в сообщение по заданию”
ReadOnlyCollection<Guid> IDataObject.RelatedTaskMessageAttachments { get; }
С помощью поле TypesByChildren можно определить тип ребенка элемента не загружая его.
IDictionary<Guid, int> IDataObject.TypesByChildren { get; }
Поле State содержит информацию о текущем статусе элемента. Загружен элемент в кеш клиента или нет. Подробнее см. DataState
DataState IDataObject.State { get; }
Поле ObjectStateInfo содержит информацию о текущем статусе ObjectState объекта и информацию о том, кто и когда совершил последнее изменения статуса. Подробнее см. DataState.
DataState IDataObject.State { get; }
Поле SynchronizationState содержит информацию о текущем статусе синхронизации элемента с сервером. Подробнее см. SynchronizationState
SynchronizationState IDataObject.SynchronizationState { get; }
Поле Files содержит список доступных файлов элемента. Содержит только информацию о файле. Тело файла необходимо загружать отдельно. Подробнее см. IFileProvider
ReadOnlyCollection<IFile> IDataObject.Files { get; }
Поле Access2 содержит информацию о текущих правах доступа к этому элементу. Подробнее см IAccessRecord.
ReadOnlyCollection<IAccessRecord> IDataObject.Access2 { get; }
Поле IsSecret содержит значение указывающее является ли этот элемент скрытым.
bool IDataObject.IsSecret { get; }
Поле ActualFileSnapshot содержит информацию о текущих фалах элемента. Подробнее см. IFilesSnapshot.
IFilesSnapshot IDataObject.ActualFileSnapshot { get; }
Поле PreviousFileSnapshots содержит информацию об изменениях файлов элемента. Это история изменения файлов элемента. Подробнее см. IFilesSnapshot.
ReadOnlyCollection<IFilesSnapshot> IDataObject.PreviousFileSnapshots { get; }
Поле Subscribers содержит список пользователей, которые подписаны на изменения этого элемента.
ReadOnlyCollection<int> IDataObject.Subscribers { get; }
Метод расширения LastChange позволяет получить инкрементальный идентификатор набора изменений, последним изменившего данный элемент. Может быть использован для ожидания загрузки новой версии элемента при получении нотификации (см. INotification.ChangesetId).
public static long LastChange(this IDataObject dataObject);
Интерфейс предназначен для просмотра информации о типе элемента.
Поле Id содержит идентификатор типа элемента.
Guid IType.Id { get; }
Поле Name содержит внутренне имя типа элемента.
string IType.Name { get; }
Поле Title содержит локализованное имя типа элемента.
string IType.Title { get; }
Поле Sort содержит порядковый номер сортировки.
int IType.Sort { get; }
Поле HasFiles показывает может ли данный тип содержать файлы.
bool IType.HasFiles { get; }
Поле Children содержит идентификаторы дочерних типов.
ReadOnlyCollection<int> IType.Children { get; }
Поле Attributes содержит информацию об атрибутах, которые может содержать элемент данного типа.
ReadOnlyCollection<IAttribute> IType.Attributes { get; }
Поле DisplayAttributes содержит информацию об отображаемых в Обозревателе проектов атрибутах.
ReadOnlyCollection<IAttribute> IType.DisplayAttributes { get; }
Поле SvgIcon содержит массив байт иконки типа в формате svg.
byte[] IType.SvgIcon { get; }
Флаг IsMountable указывает может ли элемент данного типа монтироваться на диск (Pilot - Storage).
bool IType.IsMountable { get; }
Поле Kind содержит вид типа элемента.
TypeKind IType.Kind { get; }
Поле IsDeleted указывает удален ли текущий тип. В системе Pilot типы не удаляются из базы данных, а только помечаются как удаленные.
bool IType.IsDeleted { get; }
Поле IsService указывает является ли текущий тип сервисным. Если данное свойство установлено в true, то элементы такого типа не будут отображаться в Обозревателе проектов. Доступ к элементам такого типа можно получить только из кода.
bool IType.IsService { get; }
Поле StateMachineId - идентификатор группы состояний, которая используется для расчета состояния ревизий документов и их фильтрации в обозревателе документов.
Guid IType.StateMachineId { get; }
Интерфейс предназначен для просмотра информации об атрибутах типа элемента.
Поле Name содержит внутреннее название атрибута типа.
string IAttribute.Name { get; }
Поле Title содержит локализованное название атрибута типа.
string IAttribute.Title { get; }
Поле IsObligatory показывает является ли данный атрибут обязательным для заполнения при создании нового элемента.
bool IAttribute.IsObligatory { get; }
Поле DisplaySortOrder содержит порядковый номер сортировки атрибута типа.
int IAttribute.DisplaySortOrder { get; }
Поле ShowInObjectsExplorer показывает будет ли данный атрибут виден в Обозревателе проектов.
bool IAttribute.ShowInObjectsExplorer { get; }
Флаг JoinWithPrevious управляет отображением атрибута в карточке объекта. При наличии свободного места атрибут с установленным флагом JoinWithPrevious будет объединен с предыдущим в одну строку.
bool IAttribute.JoinWithPrevious { get; }
Поле IsService показывает является ли данный атрибут сервисным.
bool IAttribute.IsService { get; }
Поле Configuration содержит дополнительную информацию типа. Например этот атрибут используется для описания меток штрих-кода или описания справочников.
string IAttribute.Configuration { get; }
Поле DisplayHeight содержит высоту атрибута, которую занимает атрибут в карточке редактирования и просмотра свойств элемента в Обозревателе проектов. По умолчанию атрибуты занимают одну строку.
int IAttribute.DisplayHeight { get; }
Поле Obligatory содержит значение показывающее, является ли атрибут обязательным к заполнению при создании.
bool Obligatory { get; }
Поле GroupTitle содержит название группы, в которую будет сгруппирован данный атрибут при отображении в карточке объекта.
string IAttribute.GroupTitle { get; }
Интерфейс предназначен для просмотра информации о файлах, которые содержит элемент.
Поле Id содержит идентификатор файла
Guid IFile.Id { get; }
Поле Size содержит информацию о размере файла.
long IFile.Size { get; }
Поле Md5 содержит хеш-код файла, вычисленный по алгоритму хеширования md5
string IFile.Md5 { get; }
Поле Name содержит имя файла с расширением.
string IFile.Name { get; }
Поле Modified содержит время последнего изменения файла.
DateTime IFile.Modified { get; }
Поле Created содержит время создания файла.
DateTime IFile.Created { get; }
Поле Accessed содержит время последнего доступа к файлу.
DateTime IFile.Accessed { get; }
Поле Signatures содержит список цифровых подписей, поставленных на файл.
ReadOnlyCollection<ISignatureRequest> IFile.SignaturesRequests { get; }
Поле StateId содержит идентификатор состояния файла.
Guid IFile.StateId { get; }
Интерфейс предназначен для просмотра информации о запросах на подпись и цифровых подписях, поставленных на файл.
Guid Id { get; }
Свойство содержит идентификатор цифровой подписи.
Guid ObjectId { get; }
Свойство содержит идентификатор задания на согласование.
int PositionId { get; }
Свойство содержит идентификатор должности пользователя, который подписал или должен подписать документ.
string Role { get; }
Свойство содержит информацию о роли пользователя, который подписал или должен подписать документ.
IReadOnlyList<string> Signs { get; }
Свойство содержит список подписей, связанных с запросом.
string RequestedSigner { get; }
Свойство содержит информацию о должности пользователя, который должен подписать документ.
public static bool IsAdditional(this ISignatureRequest signature)
Метод возвращает значение, указывающее виртуальный запрос на подпись или нет.
Интерфейс предназначен для просмотра информации о должностях и структурных подразделениях организации.
Поле Id содержит идентификатор должности или структурного подразделения.
int IOrganisationUnit.Id { get; }
Поле Kind возвращает тип элемента организационной структуры.
OrganisationUnitKind IOrganisationUnit.Kind { get; }
Поле Title содержит локализованное наименование должности или структурного подразделения.
string IOrganisationUnit.Title { get; }
Поле IsDeleted показывает удалена ли должность или структурное подразделение. В системе Pilot организационные единицы не удаляются из базы данных, а только помечаются как удаленные.
bool IOrganisationUnit.IsDeleted { get; }
Метод расширения IsChief показывает, является ли должность руководящей.
bool IOrganisationUnit.IsChief { get; }
Поле Children содержит идентификаторы дочерних должностей или структурных подразделений.
ReadOnlyCollection<int> IOrganisationUnit.Children { get; }
Метод расширения Person возвращает идентификатор пользователя, занимающего должность. Если должность вакантна, значение будет -1.
Метод расширения VicePersons возвращает список идентификаторов пользователей-заместителей на должности. Порядок идентификаторов в списке определяет порядок вступления заместителей в должность при неактивном состоянии пользователя.
Метод расширения GroupPersons возвращает список идентификаторов пользователей в группе.
Интерфейс предназначен для просмотра информации о пользователе системы Pilot.
Поле Id содержит уникальный идентификатор пользователя.
int IPerson.Id { get; }
Поле Login содержит имя пользователя (login).
string IPerson.Login { get; }
Поле DisplayName содержит отображаемое имя пользователя. Например ФИО.
string IPerson.DisplayName { get; }
Метод расширения Email возвращает электронную почту пользователя
static string Email(this IPerson person)
Метод расширения Phone возвращает телефон пользователя
static string Phone(this IPerson person)
Поле Positions содержит список должностей, которые в данный момент занимает пользователь.
ReadOnlyCollection<IPosition> IPerson.Positions { get; }
Поле MainPosition содержит основную должность пользователя.
IPosition IPerson.MainPosition { get; }
Поле Comment содержит дополнительные сведения о пользователе.
string IPerson.Comment { get; }
Метод расширения IsInactive возвращает true, если статус пользователя “Недоступен”.
Поле Sid содержит уникальный идентификатор доменной учетной записи пользователя.
string IPerson.Sid { get; }
Поле IsDeleted показывает удален пользователь или нет. В системе Pilot информация пользователях не удаляется из базы данных. Пользователи помечаются как удаленные.
bool IPerson.IsDeleted { get; }
Поле IsAdmin показывает является ли текущий пользователь администратором.
bool IPerson.IsAdmin { get; }
Поле ActualName содержит актуальное имя пользователя. По умолчанию это поле выводит информацию из поля DisplayName. Если поле DisplayName не заполнено, то данное поле выводит информацию из поля Login.
string IPerson.ActualName { get; }
Метод расширения Groups возвращает список идентификаторов групп, в которых состоит пользователь
Метод расширения AllOrgUnits возвращает список идентификаторов всех должностей, подразделений и групп, в которых состоит пользователь.
Интерфейс предназначен для просмотра информации о должности пользователя.
Поле Order содержит порядковый номер должности пользователя. Основная должность имеет наименьший порядковый номер.
int IPosition.Order { get; }
Поле Position содержит идентификатор должности пользователя.
int IPosition.Position { get; }
Интерфейс предназначен для просмотра информации об уровне доступа.
Содержит уровень доступа к элементу.
AccessLevel IAccess.AccessLevel { get; }
Содержит дату, до которой действует право доступа.
DateTime IAccess.ValidThrough { get; }
Флаг, указывающий будут ли наследовать дочерние элементы текущее право доступа.
bool IAccess.IsInheritable { get; }
Флаг, указывающий унаследовано право от родительского элемента или нет.
bool IAccess.IsInherited { get; }
Интерфейс предназначен для просмотра информации о правах доступа на элемент.
Содержит идентификатор должности для которого действует указанный уровень доступа.
int IAccessRecord.OrgUnitId { get; }
Содержит информацию об уровене доступа. Подробнее см. IAccess
IAccess IAccessRecord.Access { get; }
Содержит информацию о должности, которая установила указанный уровень доступа.
int IAccessRecord.RecordOwner { get; }
Содержит идентификатор элемента, с которого текущий элемент получил унаследованное право доступа.
Guid IAccessRecord.InheritanceSource { get; }
Интерфейс предназначен для просмотра информации об элементе Pilot-Storage.
Поле DataObject содержит полную информацию об элементе.
IDataObject IStorageDataObject.DataObject { get; }
Поле Path содержит абсолютный путь до элемента на Pilot-Storage.
string IStorageDataObject.Path { get; }
Поле State содержит текущее состояние элемента.
StorageObjectState IStorageDataObject.State { get; }
Поле IsDirectory показывает является ли текущий элемент папкой.
bool IStorageDataObject.IsDirectory { get; }
Интерфейс предназначен для просмотра информации о состоянии объекта.
Поле State содержит ифнормацию о состоянии объекта.
ObjectState IStateInfo.State { get; }
Поле Date содержит ифнормацию дате последнего изменения состояния объекта.
DateTime IStateInfo.Date { get; }
Поле PersonId содержит идентификатор пользователя, изменившего состояние объекта последним.
int IStateInfo.PersonId { get; }
Поле PositionId содержит идентификатор позиции пользователя, изменившего состояние объекта последним.
int IStateInfo.PositionId { get; }
Интерфейс предоставляет доступ к свойствам связи элемента.
Поле Id содержит идентификатор связи. У двух связанных между собой объектов должны быть связи с одинаковым идентификатором.
Guid IRelation.Id { get; }
Поле TargetId содержит идентификатор элемента, с которым связан текущий объект.
Guid IRelation.TargetId { get; }
Поле Type содержит тип связи. Подробнее см ObjectRelationType
ObjectRelationType IRelation.Type { get; }
Поле Name содержит имя связи.
string IRelation.Name { get; }
Поле VersionId содержит дату создания версии документа.
DateTime IRelation.VersionId { get; }
Поле SourceRelationId содержит идентификатор связи, с которой данная связь скопирована.
Guid IRelation.SourceRelationId { get; }
Интерфейс содержит информацию о файлах элемента.
Поле Created содержит дату создания снимка файлов.
DateTime IFilesSnapshot.Created { get; }
Поле CreatorId содержит идентификатор пользователя сделавшего снимок файлов.
int IFilesSnapshot.CreatorId { get; }
Поле Reason содержит информацию о причине создания снимка файлов.
string IFilesSnapshot.Reason { get; }
Поле Files содержит список файлов снимка.
ReadOnlyCollection<IFile> IFilesSnapshot.Files { get; }
Интерфейс содержит информацию о лицензии для определенного продукта.
Поле ProductId содержит номер продукта.
int ILicenseInfo.ProductId { get; }
Поле IsExpired содержит информацию просрочена ли лицензия.
bool ILicenseInfo.IsExpired { get; }
Поле IsCheated содержит информацию о корректности файла лицензии.
bool ILicenseInfo.IsCheated { get; }
Поле ExpirationDate дату истечения лицензии.
DateTime ILicenseInfo.ExpirationDate { get; }
Поле MaxLicensesCount содержит количество рабочих мест, выделенных для данного продукта.
int ILicenseInfo.MaxLicensesCount { get; }
Интерфейс IUserState описывает пользовательское состояние
Поле Id содержит уникальный идентификатор пользовательского состояния. Данный идентификатор в виде строки записывается как значение атрибута в объект, находящийся в данном состоянии.
Guid IUserState.Id { get; }
Поле Name содержит уникальное внутреннее имя пользовательского состояния.
string IUserState.Name { get; }
Поле Title содержит отображаемое имя пользовательского состояния.
string IUserState.Title { get; }
Поле Icon содержит иконку пользовательского состояния в формате SVG.
byte[] IUserState.Icon { get; }
Поле Color содержит цвет пользовательского состояния из перечисления возможных цветов.
UserStateColors IUserState.Color { get; }
Поле IsDeleted показывает, было ли удалено пользовательское состояние.
bool IUserState.IsDeleted { get; }
Интерфейс IUserStateMachine описывает машину состояний
Поле Id содержит уникальный идентификатор машины состояния. Данный идентификатор в виде строки записывается в IAttribute.Configuration для связи атрибута типа “Состояние” с машиной состояний.
Guid IUserStateMachine.Id { get; }
Поле Title содержит имя машины состояний.
string IUserStateMachine.Title { get; }
Поле StateTransitions содержит список переходов машины состояний. Ключом словаря является идентификатор состояния, значением - список переходов, доступных для данного состояния.
IDictionary<Guid, IEnumerable<ITransition>> IUserStateMachine.StateTransitions { get; }
Интерфейс ITransition описывает переход в машине состояний
Поле StateTo содержит идентификатор состояния, в которое доступен переход.
Guid ITransition.StateTo { get; }
Поле DisplayName содержит название команды в пользовательском интерфейcе, которая осуществляет данный переход.
string ITransition.DisplayName { get; }
Поле AvailableForPositionsSource определяет права доступа на данный переход. По умолчанию (при значении null), данный переход доступен всем пользователям, у которых есть права на редактирование объекта. Значения, отличные от null, позволяют наложить дополнительные ограничения на доступность перехода. В данный массив строк могут быть записаны значения двух типов:
1) Локальные роли. Локальные роли начинаются с символа & и указывают на атрибут типа “Организационная единица”, в котором будут записаны идентификаторы должностей и подразделений, имеющих права доступа на данный переход.
2) Идентификаторы элементов организационной структуры. Выглядят как целое число и указывают, какие должности или подразделения будут иметь права доступа на данный переход.
string[] ITransition.AvailableForPositionsSource { get; }
Интерфейс IReportItem описывает объект типа отчет.
Поле Id содержит уникальный идентификатор объекта.
Guid IReportItem.Id { get; }
Поле Name содержит текущее имя отчета.
string IReportItem.Name { get; }
Поле Type возвращает тип отчета.
IType IReportItem.Type { get; }
Поле SourceTypesNames возвращает список имен типов объектов, для которых данный отчет может быть построен. То есть список допустимых типов объектов, которые могут использоваться как параметр отчета.
HashSet<string> IReportItem.SourceTypesNames { get; }
Интерфейс обработчика клика левой кнопки мыши по документу.
Метод вызывается при клике левой кнопки мыши
void OnLeftMouseButtonClick(XpsRenderClickPointContext pointContext);
где pointContext - XpsRenderClickPointContext
Метод вызывается при клике левой кнопки мыши
void OnLeftMouseButtonClick(XpsRenderClickPointContext pointContext);
где pointContext - XpsRenderClickPointContext
Интерфейс описывает элемент истории изменения объекта
Поле Id содержит идентификатор элемента.
Guid Id { get; }
Поле ObjectId содержит идентификатор объекта.
Guid ObjectId { get; }
Поле Reason содержит причину изменения объекта.
string Reason { get; }
Поле Created содержит дату и время создания изменения объекта.
DateTime Created { get; }
Поле CreatorId содержит идентификатор пользователя, создавшего изменение.
int CreatorId { get; }
Поле Object содержит состояние объекта на момент изменения.
IDataObject Object { get; }
Интерфейс описывает сообщение
Идентификатор сообщения.
Guid Id { get; }
Специфичные для определенного типа сообщения данные
byte[] Data { get; }
Идентификатор пользователя, создателя сообщения
int CreatorId { get; }
Серверная дата создания сообщения в UTC
DateTime? ServerDateUtc { get; }
Клиентская дата создания сообщения в UTC
DateTime ClientDateUtc { get; }
Идентификатор чата
Guid ChatId { get; }
Идентификатор связанного сообщения
Guid? RelatedMessageId { get; }
Тип сообщения
MessageType Type { get; }
Интерфейс описывает чат
Идентификатор чата.
Guid Id { get; }
Название чата.
string Name { get; }
Описание чата.
string Description { get; }
Идентификатор создателя чата
int CreatorId { get; }
Тип чата
ChatKind Type { get; }
Идентификатор последнего сообщения в чате
Guid? LastMessageId { get; }
Дата сощдания чата в UTC
DateTime CreationDateUtc { get; }
Коллекция связанных сообщений. Сообщения RelatedMessageId которых, равен идентифкатору данного сообщения
IReadOnlyCollection<IChatMessage> RelatedMessages { get; }
Данные текстового сообщения
T GetData<T>();
Где T один из типов из списка:ITextMessageData для текстового сообщения
Интерфейс описывает данные текстового сообщения
Текст сообщения
string Text { get; }
Вложения в сообщения
List<IChatRelation> Attachments { get; }
Определяет, доступно ли редактирование для сообщения
string IsReadOnly { get; }
Интерфейс описывает данные связи сообщения с объектом
Идентификатор объекта
Guid ObjectId { get; set; }
Тип связи
ChatRelationType Type { get; set; }
идентификатор сообщения, создавшего связь
Guid? MessageId { get; set; }
Признак удаленной связи
bool IsDeleted { get; set; }
Интерфейс описывает данные участника чата
Идентификатор чата
Guid ChatId { get; }
Идентификатор пользователя
int PersonId { get;}
Признак администратора чата
bool IsAdmin { get;}
Признак удаленного участника
bool IsDeleted { get; }
Признак подписки на уведомления
bool IsNotifiable { get;}
Дата создания
DateTime DateUpdatedUtc { get; }
Признак пользователя, не являющегося участником чата, но просматривающего его
bool IsViewerOnly { get; }
Перечисление состояний элемента.
Не известное состояние элемента. Все создаваемые элементы получают данное состояние.
DataState.Unknown;
Элемент существует, но не загружен в память клиента.
DataState.NoData;
Элемент существует и загружен в память клиента.
DataState.Loaded;
Элемента не существует.
DataState.NonExistent;
Перечисление состояний синхронизации элемента с сервером.
Элемент синхронизирован с сервером. Элемент на сервере идентичен элементу в кеше клиента.
SynchronizationState.Synchronized;
Элемент в ожидании синхронизации с сервером.
SynchronizationState.AwaitingForSynchronization;
Изменения внесенные в элемент по каким-то причинам были отклонены сервером. Например отсутствие прав на изменение атрибутов элемента.
SynchronizationState.SynchronizationAborted;
Перечисление видов типа элемента.
Тип элемента является пользовательским и элементы данного типа могут отображаться в Обозревателе проектов.
TypeKind.User;
Тип элемента является системным и элементы данного типа не отображаются в Обозревателе проектов.
TypeKind.System;
Перечисление состояний элемента.
Состояние по умолчанию. Элемент “живой”.
ObjectState.Alive;
Элемент удален в корзину
ObjectState.InRecycleBin;
Элемент удален безвозвратно
ObjectState.DeletedPermanently;
Элемент заморожен
ObjectState.Frozen;
Запрошено разрешение на блокировку
ObjectState.LockRequested;
Элемент заблокирован
ObjectState.LockAccepted;
Перечисление состояний элемента задания.
Черновик
State.None;
Задание выдано
State.Assigned;
Задание взято в работу
State.InProgress;
Задание отозвано
State.Revoked;
Задание находится на проверке
State.OnValidation;
Задание выполнено
State.Completed;
Перечисление возможных уровней доступа к элементам.
Нет доступа к элементу.
AccessLevel.None;
Уровень доступа, позволяющий просматривать свойства текущего элемента.
AccessLevel.View;
Уровень доступа, позволяющий создавать дочерние элементы.
AccessLevel.Create;
Уровень доступа, позволяющий редактировать текущий элемент.
AccessLevel.Edit;
Уровень доступа, отвечающий за возможность аннотирования/подписания документов.
AccessLevel.Agreement;
Уровень доступа, позволяющий замораживать/размораживать текущий элемент.
AccessLevel.Freeze;
Уровень доступа, позволяющий делегировать права доступа для текущего элемента.
AccessLevel.Share;
Уровень доступа, позволяющий просматривать свойства текущего элемента и создавать дочерние элементы. Это комбинация двух уровней доступа Create и View.
AccessLevel.ViewCreate;
`
Полный доступ к элементу. Уровень доступа, позволяющий просматривать, редактировать свойства текущего элемента и создавать дочерние элементы. Это комбинация уровней доступа Create, View и Edit.
AccessLevel.ViewEdit;
Перечисление состояний элемента Pilot-Storage.
StorageObjectState.None = 0;
Неизвестное состояние элемента.
StorageObjectState.NotLoaded = 1;
Элемент не загружен.
StorageObjectState.Loaded = 2;
Элемент загружен.
StorageObjectState.Outdated = 4;
Элемент скачан с сервера. Но на сервере есть более новая версия.
StorageObjectState.NotSent = 8;
Элемент еще не был отправлен на сервер.
StorageObjectState.Edited = 16;
Есть локальные изменения, которые не отправлены на сервер.
StorageObjectState.Aborted = 32;
Изменения не принятые сервером.
StorageObjectState.Temp = 64;
Временный элемент, который никогда не будет отправлен на сервер.
StorageObjectState.Locked = 128;
Элемент заблокирован.
StorageObjectState.Downloading = 256;
Элемент в процессе загрузки.
StorageObjectState.Conflicted = 512;
Элемент в состоянии конфликта.
Тип связи с исходным файлом
ObjectRelationType.SourceFiles;
Тип связи, описывающий вложения в задание документов или файлов инициатором задания.
ObjectRelationType.TaskInitiatorAttachments;
Тип связи, описывающий вложения в переписку по заданию документов или файлов.
ObjectRelationType.MessageAttachments;
Пользовательский тип связи. Этот тип связи отображается во вкладке "Связи" в клиенте Pilot.
ObjectRelationType.Custom;
Перечисление типов элементов организационной структуры.
Подразделение организационной структуры. Может включать дочерние подразделения и должности. Пользователь не может быть назначен на подразделение.
OrganisationUnitKind.Department;
Должность организационной структуры. Не может иметь дочерних элементов. На должность может быть назначен пользователь и список заместителей.
OrganisationUnitKind.Position;
Группа организационной структуры. Может быть создана только на первом уровне организационной структуры, не может содержать дочерних элементов и иметь назначенного пользователя. Используется для объединения пользователей в группы.
OrganisationUnitKind.Group;
Перечисление видов клиентов
IClientInfo.Ice = 0,
Pilot-ICE клиент
IClientInfo.IceEnterprise = 1,
Pilot-ICE Enterprise клиент
IClientInfo.ThreeDStorage = 2,
3D-Storage клиент
IClientInfo.Ecm = 3,
Pilot-ECM клиент
IClientInfo.Bim = 4,
Pilot-BIM клиент
Перечисление режимов при наложении штампов на pdf-документы
PdfStamperMode.Preview = 0,
Отображение в просмотрщике документов
PdfStamperMode.Print = 1,
Вывод на печать
PdfStamperMode.Export = 2
Экспорт проекта
Аргументы события OfflineEventArgs присылаются расширению когда возникает событие перехода клиента Pilot-ICE/ECM в режим автономной работы.
public class OfflineEventArgs : MarshalByRefObject { }
Аргументы события OnlineEventArgs присылаются расширению когда возникает событие перехода клиента Pilot-ICE/ECM в режим автономной работы в сети.
public class OnlineEventArgs : MarshalByRefObject { }
Аргументы события CloseTabEventArgs присылаются расширению перед закрытием вкладки.
public class CloseTabEventArgs : MarshalByRefObject { }
Идентификатор закрываемой вкладки.
public Guid CloseTabEventArgs.TabId { get; }
Заголовок закрываемой вкладки.
public string CloseTabEventArgs.TabTitle { get; }
Аргументы события OpenTabEventArgs присылаются расширению перед открытием новой вкладки.
public class OpenTabEventArgs : MarshalByRefObject { }
Заголовок открываемой вкладки.
public string OpenTabEventArgs.TabTitle { get; }
Идентификатор открываемой вкладки.
public Guid OpenTabEventArgs.TabId { get; }
Аргументы события ActiveTabChangedEventArgs присылаются расширению при изменении активной вкладки.
public class ActiveTabChangedEventArgs : MarshalByRefObject { }
Класс ActiveTabChangedEventArgs содержит поле с идентификатором активной вкладки.
public Guid ActiveTabChangedEventArgs.ActiveTabId { get; }
Аргументы события TabUndockedEventArgs присылаются расширению при перемещении вкладки в отдельное окно.
public class TabUndockedEventArgs : MarshalByRefObject { }
Класс TabUndockedEventArgs содержит поле с идентификатором вкладки.
public Guid TabUndockedEventArgs.TabId { get; }
Класс TabUndockedEventArgs содержит поле с дескриптором окна.
public IntPtr TabUndockedEventArgs.Handle { get; }
Аргументы события TabDockedEventArgs присылаются расширению при перемещении вкладки из отдельного окна в панель вкладок.
public class TabDockedEventArgs : MarshalByRefObject { }
Класс TabDockedEventArgs содержит поле с идентификатором вкладки.
public Guid TabDockedEventArgs.TabId { get; }
Аргументы события LoadedEventArgs присылаются расширению после загрузки клиентом Pilot-ICE/ECM данного расширения.
public class LoadedEventArgs : MarshalByRefObject { }
Аргументы события LoadedEventArgs присылаются расширению перед выгрузкой клиентом Pilot-ICE/ECM данного расширения.
public class UnloadedEventArgs : MarshalByRefObject { }
Имя системного типа папка для Pilot-Storage.
public const string PROJECT_FOLDER = "Project_folder";
Имя системного типа файл для Pilot-Storage.
public const string PROJECT_FILE = "File";
Имя системного типа расширение.
public const string EXTENSION = "Extension";
Имя системного типа папка расширений.
public const string EXTENSION_FOLDER = "Extension_folder";
Имя системного типа ярлык.
public const string SHORTCUT = "Shortcut_E67517F1-93F5-4756-B651-133B816D43C8";
Имя системного типа Отчет.
public const string REPORT = "Report_6088AF81-061E-456E-9225-CF65B7B25368";
Имя системного типа Папка отчетов.
public const string REPORT_FOLDER = "Report_Folder_F2CC6F1D-70E1-4E9B-B32F-BEB3E991318F";
Имя системного типа Умная папка.
public const string SMART_FOLDER = "Smart_folder_type";
Имя системного типа Папка шаблонов заданий.
public const string TASK_TEMPLATE_FOLDER = "Task_template_folder_A0A09765-E6FB-4272-87EE-37793283DBC5";
Имя системного типа Шаблон задания.
public const string TASK_TEMPLATE = "Task_template_05339782-CCBA-4786-80C3-0F6C7E0EF3C5";
Имя системного типа Папка шаблонов документов.
public const string DOCUMENT_TEMPLATE_FOLDER = "Document_template_folder_793D0CE8-65E6-484E-AAF9-7E095AF9DBD2";
Имя системного типа Шаблон документов.
public const string DOCUMENT_TEMPLATE = "Document_template_89B9E233-A6F9-4B9C-B970-55B3B3A77CED";
Имя системного типа Глобальный корень документов.
public const string GLOBAL_ROOT_TYPE_NAME = "Root_object_type";
Префикс для типа Процесс.
public const string WORKFLOW_PREFIX = "workflow_";
Префикс для типа Этап задания.
public const string STAGE_PREFIX = "stage_";
Префикс для типа Задание.
public const string TASK_PREFIX = "task_";
Префикс для типов системы BIM BIM типы.
public const string BIM_PREFIX = "bim_";
Константы для системных атрибутов.
Имя атрибута с датой удаления элемента.
public const string DELETE_DATE = "DeleteDate 9349ED7C-C2D7-4B8B-852A-83140F158611";
Имя атрибута с идентификатором пользователя, удалившего элемент.
public const string DELETE_INITIATOR_PERSON = "DeleteInitiatorPerson BE56ECD1-F4C5-40E2-A83C-274EAE4D02A9";
Имя атрибута с идентификатором должности пользователя, удалившего элемент.
public const string DELETE_INITIATOR_POSITION = "DeleteInitiatorPosition 35E355AC-97B3-40FC-9636-1648402040D4";
Имя атрибута с критерием поиска для умной папки
public const string SEARCH_CRITERIA = "SearchCriteria 52F6E73A-D736-49CD-8807-5AD955506A37";
Имя атрибута с именем для умной папки
public const string SMART_FOLDER_TITLE = "SmartFolderTitle 3AE3FFC8-A776-4E61-87D0-FFD8B50CBBA8";
Имя атрибута с идентификатором объекта-контекста поиска для умной папки
public const string SEARCH_CONTEXT_OBJECT_ID = "SearchContextObjectId 257E6DB2-F3A3-4231-83D4-DB57C3FF059E";
Имя атрибута, значение которого указывает на то, спрятана ли папка или файл на Pilot-Storage
public const string IS_HIDDEN = "IsHidden FDF5475C-93FA-41F3-8243-F1810854DEBD";
Имя атрибута с именем файла или папки на Pilot-Storage
public const string PROJECT_ITEM_NAME = "Title 4C281306-E329-423A-AF45-7B39EC30273F";
Имя атрибута с именем папки для расширений
public const string EXTENSION_FOLDER_NAME = "Extension_folder_name EE4DE4B7-FFB7-455E-8E15-C185CFDB34FA";
Имя атрибута с именем расширения
public const string EXTENSION_NAME = "Extension_name 53522556-0749-46DE-913E-EDA195AD1299";
Имя атрибута с описанием расширения
public const string EXTENSION_ADDITIONAL = "Extension_additional 9A428222-2031-4F5E-A367-C5BAA18DFCA5";
Имя атрибута с идентификатором объекта, на который ссылается ярлык
public const string SHORTCUT_OBJECT_ID = "Shortcut_object_id_CF11FD82-3D56-4DBC-B7F8-DF91CA1F9885";
Имя атрибута с именем папки отчетов
public const string REPORT_FOLDER_NAME = "Report_folder_name_BDBDEDD1-BFCB-4E2C-BE44-3E4BEBBB58F9";
Имя атрибута с именем элемента отчет
public const string REPORT_NAME = "Report_name_D745D627-E7CD-4E3A-B30E-F9EDC1A09D77";
Имя атрибута с типами элементов с данными для отчета
public const string REPORT_SOURCE_TYPES_NAMES = "Report_source_types_names_76e09b65-9785-40cc-986e-b35cd6c3a4fe";
Имя атрибута с именем шаблона задания
public const string TASK_TEMPLATE_NAME = "Task_template_name_CE25F101-E758-4A68-9F16-E73B72F39FBC";
Имя атрибута с объектом шаблона задания
public const string TASK_TEMPLATE_VALUE = "Task_template_value_3C190DF3-3644-47F4-AF64-45C140207054";
Имя атрибута с именем папки шаблонов заданий
public const string TASK_TEMPLATE_FOLDER_NAME = "Task_template_folder_name_DC250687-50D3-40E9-8B9A-71ACD01D50F7";
Имя атрибута с тегами
public const string TAGS = "Tags_BCA19031-E5A1-49D3-A55F-47B30A8F7243";
Имя атрибута с идентификатором файла для публикации по умолчанию
public const string DEFAULT_PUBLISH_FILE_ID = "Default_publish_file_id_BA9EA041-93E8-4AE9-9E09-0C40221DE75D";
Имя атрибута с именем шаблона документов
public const string DEFAULT_PUBLISH_FILE_ID = "Default_publish_file_id_BA9EA041-93E8-4AE9-9E09-0C40221DE75D";
Имя атрибута с идентификатором типа шаблона документов
public const string DOCUMENT_TEMPLATE_TYPE_ID = "Document_template_type_id_0D8595C0-45CF-4C98-8AB2-EE5C9276DE3E";
Имя атрибута с именем папки шаблонов документов
public const string DOCUMENT_TEMPLATE_FOLDER_NAME = "Document_template_folder_name_D6C7CC9A-0850-47B7-88D0-1045F8D5561D";
Константы для системных состояний.
Идентификатор состояния Отозвано
public static Guid TASK_REVOKED_STATE_ID = Guid.Parse("abdbe49a-7094-4084-9673-eb5fb3f95262");
Идентификатор состояния Нет
public static Guid TASK_NONE_STATE_ID = Guid.Parse("d8ae8c3a-6f46-45d2-835b-563fe2b47acd");
Константа Исполнитель не назначен
public static string TASK_NO_EXECUTOR_ASSIGNED_STATE_NAME = "noExecutorAssigned";
Идентификаторы системных объектов.
Идентификатор корневого объекта элеметов
public static readonly Guid RootObjectId = new Guid("00000001-0001-0001-0001-000000000001");
Идентификатор корневого объекта расширений
public static readonly Guid ExtensionRootObjectId = new Guid("E6519D37-1984-407E-96A0-1CD371F68F16");
Идентификатор корневого объекта отчетов
public static readonly Guid ReportRootObjectId = new Guid("7DAB217D-6E06-4C2C-AB77-B5EC9361415D");
Идентификатор корневого объекта шаблонов заданий
public static readonly Guid TaskTemplateRootObjectId = new Guid("DB4AB44C-B3D1-4F5A-B049-13CDF0C2EFE7");
Идентификатор корневого объекта шаблонов документов
public static readonly Guid DocumentTemplateRootId = new Guid("109DA1F5-7E1A-4DF4-95BD-1FD5AA023DD6");
Константы имен системных файлов. Эти константы можно использовать при фильтрации файлов элемента или добавлении нового.
Пример добавления миниатюры к элементу:
IObjectBuilder.AddFile(Path.GetFileName(filename) + SystemFileNames.THUMBNAIL_FILE_NAME_POSTFIX, bitmapStream, DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow);
[Obsolete]
Имя файла с описанием замечания
public const string ANNOTATIONS_DEFINITION = "Annotation";
Префикс имени файла с описанием графического элемента
public const string GRAPHIC_LAYER_ELEMENT_DEFINITION = "PILOT_GRAPHIC_LAYER_ELEMENT_";
Префикс имени файла с содержимым графического элемента
public const string GRAPHIC_LAYER_ELEMENT_CONTENT = "PILOT_CONTENT_GRAPHIC_LAYER_ELEMENT_";
[Obsolete]
Имя файла с содержимым сообщения к замечанию
public const string ANNOTATION_CHAT_MESSAGE = "Note_Chat_Message";
Имя файла с цифроврой подписью
public const string DIGITAL_SIGNATURE = "PilotDigitalSignature";
Имя файла с миниатюрой для файла на Pilot-Storage
public const string THUMBNAIL_FILE_NAME_POSTFIX = "PilotThumbnail";
Имя файла с описанием текстовых меток
public const string TEXT_LABELS_DEFINITION = "PilotTextLabels";
Имя файла с описанием штрих-кода
public const string BARCODE_DEFINITION = "PilotBarcode";
Интерфейс предназначен для просмотра информации о сообщении.
Поле Id содержит идентификатор сообщения.
Guid IChatMessage.Id { get; }
Поле Data содержит специфичные для определенного типа сообщения данные.
byte[] IChatMessage.Data { get; }
Поле CreatorId содержит идентификатор пользователя создавшего сообщение.
int IChatMessage.CreatorId { get; }
Поле ServerDate содержит содержит серверную дату-время создания собщения в формате UTC.
DateTime? IChatMessage.ServerDate { get; }
Поле LocalDate содержит клиентскую дату-время создания сообщения в формате UTC.
DateTime IChatMessage.LocalDate { get; }
Поле ChatId содержит идентификатор чата.
Guid IChatMessage.ChatId { get; }
Поле RelatedMessageId содержит идентификатор сообщения, с которым связано данное сообщение. Например: отредактированное, отвеченное, прочитанное сообщение.
Guid IChatMessage.RelatedMessageId { get; }
Поле Type содержит тип сообщения. Подробнее см. MessageType
Guid IChatMessage.RelatedMessageId { get; }
Поле RelatedMessages содержит сообщения, которые ссылаются на данное сообщение.
List<IChatMessage> IChatMessage.RelatedMessages{ get; }
Поле TextMessageData содержит данные специфичные для текстового сообщения. Подробнее см. ITextMessageData
ITextMessageData IChatMessage.TextMessageData{ get; }
Шаблоны хранятся в сериализованном виде как строковое значение специальных системных атрибутов. Для того чтобы получить содержимое шаблона необходимо десериализовать это строковое значение.
Шаблоны заданий и процессов сохраняются как дочерние объекты корневого объекта шаблонов заданий, который можно получить по его системному идентификатору SystemObjectIds.TaskTemplateRootObjectId. Он может включать объекты двух типов: непосредсвенно шаблоны заданий и процессов - объекты системного типа SystemTypeNames.TASK_TEMPLATE; и папки шаблонов - объекты системного типа SystemTypeNames.TASK_TEMPLATE_FOLDER. Таким образом можно организовать древовидную систему хранения шаблонов.
Объекты шаблонов заданий и процессов хранят содержимое в сериализованном виде как строковое значение системного атрибута SystemAttributeNames.TASK_TEMPLATE_VALUE. Для десериализации шаблона задания и получения доступа к его составляющим используется интерфейс ITaskTemplateParser. Пример Ascon.Pilot.SDK.TaskSample включает в себя демонстрацию получения шаблонов заданий и использования этого интерфейса для выдачи заданий и процессов на основе этих шалонов.
Для получения доступа к интерфейсу поиска его необходимо передать в конструктор. При этом конструктор необходимо пометить атрибутом [ImportingConstructor].
Метод используется для получения составляющих шаблона задания или процесса из сериализованного в строку значения шаблона.
var template = _taskTemplateParser.Parse(templateStr);
где:
template - десериализованное представление шаблона, объект типа ITaskTemplateItem;_taskTemplateParser - экземпляр объекта, реализующего интерфейс ITaskTemplateParser;templateStr - исходное сериализованное строковое представление шаблона, которое было получено из атрибута объекта шаблона;
Этот интерфейс позволяет получить доступ к составляющим элементам шаблона задания или процесса.
int TypeId { get; }
Идентификатор типа элемента, который описывает данный элемент шаблона: это может быть идентификатор типа задания, типа этапа процесса или идентификатор типа процесса. Позволяет узнать, объект какого типа должен быть создан на основе этого элемента шаблона.
IEnumerable<ITaskTemplateItem> Children { get; }
Список дочерних элементов шаблона. Шаблон обычного задания состоит только из одного элемента, его коллекция дочерних элементов всегда пуста. Шаблон процесса отличается тем, что его свойство Children содержит список элементов шаблона, описывающих этапы процесса. Каждый из элементов шаблона этапа в свою очередь содержит коллекцию дочерних элементов, которые описывают шаблоны заданий данного этапа. Метод MakeWorkflowFromTemplate примера Ascon.Pilot.SDK.TaskSample демонстрирует работу с шаблоном процесса и последовательным получением шаблонов этапов и шаблонов заданий каждого этапа.
IDictionary<string, object> Attributes { get; }
Список атрибутов и их значений, которыми обладает элемент шаблона. Так, в нем могут хранится заголовок и описание задания или процесса, список исполнителей и аудиторов задания и т.д.
IEnumerable<Guid> Attachments { get; }
Список идентификаторов объектов, которые являются вложениями данного элемента шаблона.
С помощью интерфейсов подписания можно реализовать свою логику подписания и валидации ЭП документов.
ВНИМАНИЕ!
Этот интерфейс является устаревшим. Используйте ICryptoProvider
Интерфейс позволяет зарегистрировать в Pilot свою логику подписания и валидации ЭП документов. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IDocumentCryptoProvider и обязательно пометить класс, реализующий интерфейс IDocumentCryptoProvider атрибутом [Export].
В системе Pilot может быть только один зарегистрированный экземпляр IDocumentCryptoProvider.
[Export(typeof(IDocumentCryptoProvider))]
public class DocumentCryptoProvider : IDocumentCryptoProvider
{
...
}
Метод вызывается только для подписанных запросов на подпись и служит для определения, готов ли IDocumentCryptoProvider прочитать информацию из подписи. Если метод вернет false, для чтения информации об электронной подписи будут использованы базовые алгоритмы Pilot.
Аргументы:
document - документ;snapshot - версия документа, для которой происходит чтение данных;signatureRequest - подписанный запрос на подпись, для которого необходимо будет прочитать информацию;Метод вызывается для подписания документа.
Аргументы:
document - документ;xpsStream - поток XPS документа со встроенными графическими слоями. Соответствует содержимому XPS документа при сохранении на диск.signatureRequests - запросы на подпись для подписания;Метод вызывается при вызове команды “Показать сертификат”.
Аргументы:
document - документ;snapshot - версия документа, для которой происходит чтение данных.signatureRequest - подписанный запрос на подпись, для которого необходимо показать сертификат;Метод вызывается для получения информации о подписанном запросе на подпись.
Аргументы:
document - документ;xpsStream - поток XPS документа со встроенными графическими слоями. Соответствует содержимому XPS документа при сохранении на диск.snapshot - версия документа, для которой происходит чтение данных.signatureRequest - запрос на подпись, для которого будет выполнено чтение;listener - используется для заполнения информации о прочитанной электронной подписи;Интерфейс позволяет зарегистрировать в Pilot свою логику подписания и валидации ЭП документов. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK ICryptoProvider и обязательно пометить класс, реализующий интерфейс ICryptoProvider атрибутом [Export].
В системе Pilot может быть несколько экземпляров ICryptoProvider.
[Export(typeof(ICryptoProvider))]
public class CryptoProvider : ICryptoProvider
{
...
}
IEnumerable<ICertificate> GetCertificates();
Метод возвращает список сертификатов, поддерживаемых расширением. Подробнее см ICertificate
void Sign(Guid documentId, IFile file, Stream stream, ICertificate cert, IEnumerable<ISignatureRequest> signatureRequests);
Метод подписывает документ. Подпись должна быть создана в формате base64 а также файлу подписи должно быть присвоено расширение .sig.
где:
documentId - идентификатор документа;file - подписываемый файл;stream - последовательность байт подписываемого файла;cert - сертификат для подписания;signatureRequests - список запросов на подпись; bool IsAlgorithmSupported(string algorithmOid);
Определяет, поддерживается ли криптоалгоритм расширением.
где:
algorithmOid - идентификатор алгоритма; bool IsAlgorithmSupported(byte[] sigBase64);
Определяет, поддерживается ли сертификат подписи расширением. Проверка необходима при импорте подписи, когда криптоалгоритм неизвестен.
где:
sigBase64 - подпись в формате base64;void ReadSignature(IDataObject document, Stream xpsStream, IFilesSnapshot snapshot, ISignatureRequest signatureRequest, IReadSignatureListener listener);
Метод вызывается для получения информации о подписанном запросе на подпись.
Аргументы:
document - документ;xpsStream - поток документа; snapshot - версия документа, для которой происходит чтение данных;signatureRequest - запрос на подпись, для которого будет выполнено чтение;listener - используется для заполнения информации о прочитанной электронной подписи; void ReadImportedSignature(Stream file, byte[] sigBase64, IImportedSignatureListener importedSignatureListener);
Метод вызывается для получения информации об импортируемой подписи.
Аргументы:
file - поток документа;sigBase64 - импортируемая подпись в формате base64;importedSignatureListener - используется для заполнения информации об импортируемой электронной подписи;
Этот интерфейс используется для заполнения информации о прочитанной электронной подписи.
void CertificateIsValid();
Вызовите этот метод, если сертификат, использованный для подписания, корректен.
void CertificateIsInvalid(string message);
Вызовите этот метод, если сертификат, использованный для подписания, некорректен.
void SignatureIsValid();
Вызовите этот метод, если подпись соответствует подписанному содержимому.
void SignatureIsInvalid(string message);
Вызовите этот метод, если подпись не соответствует подписанному содержимому.
void SetSignerName(string name);
Вызовите этот метод для вывода имени подписанта.
void SetSignDate(string signDate);
Вызовите этот метод для вывода времени подписания.
void SetCustomState(ImageSource icon, string title, string description);
Вызовите этот метод для установки пользовательского состояния запроса на подпись (иконка и тултип).
void SetSignerNameForeground(Color color);
Вызовите этот метод для установки цвета текста имени подписанта.
void ReadCompleted();
Вызовите этот метод для окончания чтения информации из электронной подписи.
Интерфейс ICertificateSelector используется для выбора сертификата для подписания через API. По умолчанию, если плагин, реализующий интерфейс ICryptoProvider, при подписании вернёт несколько сертификатов, будет показан диалог выбора сертификата.
Объявление экспортного типа ICertificateSelector в модуле расширения перекрывает базовое поведение и позволяет реализовать свою логику выбора сертификата.
В системе Pilot может быть только один зарегистрированный экземпляр ICertificateSelector.
[Export(typeof(ICertificateSelector))]
public class CustomCertificateSelector : ICertificateSelector
{
...
}
Интерфейс позволяет получить управление над экземпляром плаигна, реализующего интерфейсы ICryptoProvider и IAutomationSigner, и с их помощью подписывать запросы на подпись в документах. Получить интерфейс можно через конструктор помеченный атрибутом [ImportingConstructor].
Метод подписывает документ выбранным сертификатом. Вызовов метода делегирует работу ICryptoProvider
void Sign(Guid documentId, IFile file, Stream stream, ICertificate cert, IEnumerable<ISignatureRequest> signatureRequests);
где:
documentId - идентификатор документа.file - подписываемый файл.stream - стрим подписываемого файла.cert - сертификат, с помощью которого будет выполнено подписание.signatureRequests - подписываемые запросы на подпись.Метод подписывает документ выбранным сертификатом при работе скриптов автоматизации. Вызовов метода делегирует работу IAutomationSigner.
void SignByAutomation(IObjectModifier modifier, Guid documentId, IFile file, Stream stream, ICertificate cert, IEnumerable<ISignatureRequest> signatureRequests);
где:
modifier - объект модификатора с изменениями, созданными автоматизацией. documentId - идентификатор документа.file - подписываемый файл.stream - стрим подписываемого файла.cert - сертификат, с помощью которого будет выполнено подписание.signatureRequests - подписываемые запросы на подпись.Метод позволяет получить серитфикат для подписания. Вызовов метода делегирует работу ICryptoProvider
ICertificate GetCertificate();
Метод позволяет получить серитфикат для подписания при работе скриптов автоматизации. Вызовов метода делегирует работу IAutomationSigner.
ICertificate GetAutomationCertificate();
Этот интерфейс используется для заполнения информации об импортируемой электронной подписи.
void CertificateIsValid();
Вызовите этот метод, если сертификат, использованный для подписания, корректен.
void CertificateIsInvalid(string message);
Вызовите этот метод, если сертификат, использованный для подписания, некорректен.
void SignatureIsValid();
Вызовите этот метод, если подпись соответствует подписанному содержимому.
void SignatureIsInvalid(string message);
Вызовите этот метод, если подпись не соответствует подписанному содержимому.
void SetPublicKeyOid(string oid);
Вызовите этот метод для того, чтобы установить идентификатор криптоалгоритма.
void SetCadesType(CadesType cadesType);
Вызовите этот метод для того, чтобы установить тип CadesType импортируемой подписи.
void ReadCompleted();
Вызовите этот метод для окончания чтения информации из электронной подписи.
Интерфейс IAutomationSigner используется для подписания документа в контексте выполнения скрипта автоматизации (интерфейс IAutomationActivity). Доступ к плагину, реализующего интерфейс IAutomationSigner, можно получить через IDigitalSigner.
[Export(typeof(IAutomationSigner))]
public class AutomationSigner : IAutomationSigner
{
...
}
IEnumerable<ICertificate> GetCertificates();
Метод возвращает список сертификатов, поддерживаемых расширением. Подробнее см ICertificate
void Sign(IObjectModifier modifier, Guid documentId, IFile file, Stream stream, ICertificate cert, IEnumerable<ISignatureRequest> signatureRequests);
Метод подписывает документ. Подпись должна быть создана в формате base64 а также файлу подписи должно быть присвоено расширение .sig.
где:
modifier - объект модификатора с изменениями, созданными автоматизацией. documentId - идентификатор документа;file - подписываемый файл;stream - последовательность байт подписываемого файла;cert - сертификат для подписания;signatureRequests - список запросов на подпись; bool IsAlgorithmSupported(string algorithmOid);
Определяет, поддерживается ли криптоалгоритм расширением.
где:
algorithmOid - идентификатор алгоритма;Интерфейс позволяет реализовать логику наложения штампов на PDF документы. Для этого необходимо реализовать интерфейс из пакета Ascon.Pilot.SDK IPdfStamper и обязательно пометить класс, реализующий интерфейс атрибутом [Export] (см. пример PdfStamper из комплекта SDK).
Метод вызывается при загрузке документа для отображения в интерфейсе Pilot. Возвращаемое значение учитывается при добавлении кнопки “Отобразить штампы” в панель инструментов просмотрщика документов: в случае возвращения true - кнопка будет добавлена, в противном случае нет. Подробнее см. PdfDocumentContext.
bool CanAddStamps(PdfDocumentContext context);
где:
context - контекст отображаемого документа, подробнее см. PdfDocumentContext.Метод вызывается при нажатии кнопки “Отобразить штампы”, при отправке документа на печать, а также при выгрузке на диск и экспорте.
void AddStamps(Stream stream, PdfStamperMode mode, PdfDocumentContext context);
где:
stream - поток файла;mode - режим при добавлении штампов, подробнее см. PdfStamperMode;context - контекст документа;Метод вызывается при перемещении штампа на документе.
void OnStampPositionChanged(StampPositionArgs args);
где:
args - аргументы события перемещения штампа, подробнее см. StampPositionArgs.Класс, описывающий контекст отображаемого документа.
IDataObject Document { get; }
Объект документа
DateTime Version { get; }
Версия
Класс, описывающий аргументы события перемещения штампа на документе.
string StampId { get; }
Идентификатор штампа
double X { get; }
Координата X после перемещения
double Y { get; }
Координата Y после перемещения
PdfDocumentContext Context { get; }
Контекст документа
Чтобы добавить свой тип события рабочего календаря, нужно добавить в конфигурацию тип с префиксом calendarexception в названии.
Базовый класс, позволяющий получить описание для конкретного рабочего дня. Пример того, как полученные данные можно пересчитать в локальное времся выбранного пользователя, можно найти в расширении Ascon.Pilot.SDK.CalendarSample.
event EventHandler<CalendarChangedEventArgs> OnChanged;
Создаёт слабую подписку на изменение рабочего графика и событий календаря.
Task<ICalendarDay> GetPersonCalendarDayAsync(int personId, DateTime date);
Возвращает описание рабочего дня для заданного пользователя,
где:
personId - идентификатор пользователя;date - локальная дата описываемого дня; Task<ICalendarDay> GetOrgUnitCalendarDayAsync(int orgunitId, DateTime date);
Возвращает описание рабочего дня для заданной должности или подразделения,
где:
orgunitId - идентификатор должности или подразделения;date - локальная дата описываемого дня;Позволяет получить данные на временном промежутке с учётом календаря рабочих дней. Результат аналогичен тому, что видит пользователь в карточке, редактируя контрол Дата и время.
Task<DateTime> GetPersonWorkingDateAsync(DateTime start, int workingDays, int personId);
Возвращает дату окончания заданного количество рабочих дней для пользователя. Дата пересчитана в локальное время пользователя,
где:
start - стартовая точка;workingDays - количество рабочих дней;personId - идентификатор пользователя; Task<DateTime> GetOrgUnitWorkingDateAsync(DateTime start, int workingDays, int personId);
Возвращает дату окончания заданного количество рабочих дней для должности или подразделения. Дата пересчитана в локальное время пользователя, который привязан к должности,
где:
start - стартовая точка;workingDays - количество рабочих дней;orgunitId - идентификатор должности или подразделения; Task<int> GetPersonWorkingDaysCountAsync(DateTime start, DateTime end, int personId);
Возвращает количество рабочих дней на временном промежутке для пользователя,
где:
start - стартовая точка;end - конечная точка;personId - идентификатор должности или подразделения; Task<int> GetOrgUnitWorkingDaysCountAsync(DateTime start, DateTime end, int orgunitId);
Возвращает количество рабочих дней на временном промежутке для должности или подразделения,
где:
start - стартовая точка;end - конечная точка;orgunitId - идентификатор должности или подразделения;Описывает рабочий день для пользователя или подразделения.
IReadOnlyList<IWorkCalendarObject> WorkCalendars { get; }
Свойство содержит список рабочих календарей, которые актуальны для пользователя или подразделения. Отсортированы в порядке приоритетности — последний элемент самый приоритетный.
IReadOnlyList<IWorkCalendarExceptionObject> WorkCalendarExceptions { get; }
Свойство содержит список событий календаря, которые актуальны для пользователя или подразделения. Отсортированы в порядке приоритетности — последний элемент самый приоритетный.
IReadOnlyList<WorkingHours> WorkingHours { get; }
Содержит рабочие часы выбранного дня, посчитанных из WorkCalendars и WorkCalendarExceptions. День является выходным, если коллекция пустая.
Обёртка над WorkCalendar
Guid ObjectId { get; }
Идентификатор объекта рабочего календаря.
WorkCalendar Schedule { get; }
Рабочий календарь.
Обёртка над WorkCalendarException
Guid ObjectId { get; }
Идентификатор объекта события рабочего календаря.
WorkCalendar Schedule { get; }
Событие рабочего календаря.
Рабочий календарь.
List<int> OrgUnits { get; set; }
Список организационных единиц, к которым относиться рабочий календарь.
List<int> People { get; set; }
Список пользователей, к которым относиться рабочий календарь.
DateTime? FromDate { get; set; }
Дата, с которой начинает действовать рабочий календарь. Действие неограниченно, если значение не указано.
DateTime? ToDate { get; set; }
Дата, до которой действует рабочий календарь. Действие неограниченно, если значение не указано.
Weekdays Weekdays { get; set; }
Описывает часы работы на каждый день недели.
Рабочий календарь.
List<int> OrgUnits { get; set; }
Список организационных единиц, к которым относиться рабочий календарь.
List<int> People { get; set; }
Список пользователей, к которым относиться рабочий календарь.
DateTime? FromDate { get; set; }
Дата, с которой начинает действовать рабочий календарь. Действие неограниченно, если значение не указано.
DateTime? ToDate { get; set; }
Дата, до которой действует рабочий календарь. Действие неограниченно, если значение не указано.
List<WorkingHours> WorkingHours { get; set; }
Описывает рабочие часы текущего дня. Выходной, если коллекция пустая. Переписывает рабочие часы календаря рабочих дней и менее приоритетных событий.
Описывает часы работы на каждый день недели. День считается выходным, если коллекция пустая.
List<WorkingHours> Mon { get; set; }
Рабочие часы для понедельника.
List<WorkingHours> Tue { get; set; }
Рабочие часы для вторника.
List<WorkingHours> Wed { get; set; }
Рабочие часы для среды.
List<WorkingHours> Thur { get; set; }
Рабочие часы для четверга.
List<WorkingHours> Fri { get; set; }
Рабочие часы для пятницы.
List<WorkingHours> Sat { get; set; }
Рабочие часы для субботы.
List<WorkingHours> Sun { get; set; }
Рабочие часы для воскресенья.
Описывает рабочие часы для конкретного дня.
TimeOnly From { get; set; }
Начало рабочего промежутка.
TimeOnly To { get; set; }
Конец рабочего промежутка.
Описывает время в часах и минутах.
byte Hour { get; set; }
Часы.
byte Minute { get; set; }
Минуты.