Некоторые заказчики при переходе с DIRECTUM 5 на Directum RX запрашивают функционал отображения списка документов с предпросмотром, чтобы пользователь мог просматривать содержимое документа без перехода в его карточку. Это особенно полезно для документов, таких как договоры и дополнительные соглашения, где требуется быстрое ознакомление с содержимым.
Для типа документа "Дополнительное соглашение" необходимо реализовать функционал, при котором в карточке ДС около свойства Договор выведена кнопка "Открыть ДС к Договору". При нажатии на кнопку должен открываться список всех дополнительных соглашений (ДС), связанных с договором, с возможностью предпросмотра их содержимого. При этом данное представление не должно влиять на другие списки для этого типа сущности.
Для реализации задачи создается вычисляемая папка с содержимым типа "Дополнительное соглашение". Папка не отображается в интерфейсе, так как используется только для настройки представления списка.
Для вычисляемой папки настраивается представление списка с видом "Компактное" и отображением "С карточкой". Это позволит отображать список документов с предпросмотром в правой части экрана.
В функции, вызываемой при нажатии на кнопку "Открыть ДС к Договору", выполняется открытие списка документов из вычисляемой папки с использованием метода ShowModal()
:
/// <summary>
/// Открыть дополнительные соглашения, связанные с договором.
/// </summary>
public virtual void OpenSupAgreements()
{
Contracts.SpecialFolders.FolderSupAgreeement.Items.ShowModal();
}
Для отображения предпросмотра в карточке документа создается отдельная вкладка с контролом предпросмотра. Для этого в событии открытия формы сохраним в параметр признак того, что сущность открыта из нашей вычисляемой папки, для этого необходимо получить из контекста вызова ID папки, откуда открывается документ:
public override void Showing(Sungero.Presentation.FormShowingEventArgs e)
{
base.Showing(e);
var folderId = Sungero.Domain.Shared.CallContextService.CurrentContext
.Where(frame => frame.FolderId != 0)
.Select(frame => frame.FolderId)
.FirstOrDefault();
e.Params.AddOrUpdate(Module.Docflow.PublicConstants.Module.IsDocumentListPreview, Contracts.SpecialFolders.FolderSupAgreeement.Id == folderId);
}
А в методе SetStateProperties() построим логику от этого параметра - будем устанавливать видимость вкладки предпросмотра и активировать ее:
public override void SetStateProperties()
{
base.SetStateProperties();
var formParams = ((Sungero.Domain.Shared.IExtendedEntity)_obj).Params;
var isDocumentListPreview = formParams.ContainsKey(Module.Docflow.PublicConstants.Module.IsDocumentListPreview) &&
(bool)formParams[Module.Docflow.PublicConstants.Module.IsDocumentListPreview];
if (isDocumentListPreview)
{
_obj.State.Pages.PreviewPageTanais.IsVisible = true;
_obj.State.Pages.PreviewPageTanais.Activate();
}
}
Теперь осталось настроить фильтрацию документов из вычисляемой папки по свойству "Договор". Оказалось, что если получать элементы, хранящиеся в папке, через Where(), то теряется контекст вызова и представление не подтягивается:
/// <summary>
/// Открыть дополнительные соглашения к договору.
/// </summary>
public virtual void OpenSupAgreement()
{
Tanais.Contracts.SpecialFolders.FolderSupAgreeement
.Items.
.Where(i => SupAgreements.Is(i) && SupAgreements.As(i).LeadingDocument.Id == _obj.LeadingDocument.Id) // после фильтрации представление не подтягивается.
.ShowModal();
}
Поэтому пойдем по другому пути - в событии получения данных вычисляемой папки опять воспользуемся контекстом вызова, тут же можем получить и ID документа, из которого вызван просмотр папки:
public virtual IQueryable<Sungero.Contracts.IContractualDocument> FolderSupAgreementDataQuery(IQueryable<Sungero.Contracts.IContractualDocument> query)
{
if (CallContext.CalledFrom(Sungero.Contracts.SupAgreements.Info))
{
var supAgreementId = CallContext.GetCallerEntityId(Sungero.Contracts.SupAgreements.Info);
if (supAgreementId == 0)
{
var entity = Sungero.Domain.Shared.CallContextService.CurrentContext.Where(x => x.FormType.ToString() == "Card").FirstOrDefault();
supAgreementId = entity == null ? 0 : entity.EntityId;
if (supAgreementId == 0)
return query.Take(0);
}
var supAgreement = Sungero.Contracts.SupAgreements.As(OverrideSolution.PublicFunctions.OfficialDocument.Remote.GetDocumentById(supAgreementId));
if (supAgreement != null)
return query.Where(x => Sungero.Contracts.SupAgreements.Is(x) && Sungero.Docflow.OfficialDocuments.Equals(x.LeadingDocument, supAgreement.LeadingDocument));
}
return query.Take(0);
}
Реализованное решение позволяет отображать список документов с предпросмотром в компактном представлении, сохраняя возможность перехода по вкладкам и просмотра свойств карточки. В обычном режиме вкладка предпросмотра скрыта, что обеспечивает гибкость и удобство использования. Актуально для версии 4.11+
Неплохо, еще бы версию директума указать, не везде есть компактное представление.
Станислав, Да актуально для версии 4.11+
Авторизуйтесь, чтобы написать комментарий