Как реализовать предпросмотр документа в списке

5 2

Введение

Некоторые заказчики при переходе с DIRECTUM 5 на Directum RX запрашивают функционал отображения списка документов с предпросмотром, чтобы пользователь мог просматривать содержимое документа без перехода в его карточку. Это особенно полезно для документов, таких как договоры и дополнительные соглашения, где требуется быстрое ознакомление с содержимым.

Кейс

Для типа документа "Дополнительное соглашение" необходимо реализовать функционал, при котором в карточке ДС около свойства Договор выведена кнопка "Открыть ДС к Договору". При нажатии на кнопку должен открываться список всех дополнительных соглашений (ДС), связанных с договором, с возможностью предпросмотра их содержимого. При этом данное представление не должно влиять на другие списки для этого типа сущности.

Реализация

1. Создание вычисляемой папки

Для реализации задачи создается вычисляемая папка с содержимым типа "Дополнительное соглашение". Папка не отображается в интерфейсе, так как используется только для настройки представления списка.

2. Настройка представления списка

Для вычисляемой папки настраивается представление списка с видом "Компактное" и отображением "С карточкой". Это позволит отображать список документов с предпросмотром в правой части экрана.

3. Логика открытия списка

В функции, вызываемой при нажатии на кнопку "Открыть ДС к Договору", выполняется открытие списка документов из вычисляемой папки с использованием метода ShowModal():                                           

/// <summary>
/// Открыть дополнительные соглашения, связанные с договором.
/// </summary>       
public virtual void OpenSupAgreements()
    {
      Contracts.SpecialFolders.FolderSupAgreeement.Items.ShowModal();
    }

 

4. Добавление предпросмотра в карточку документа

Для отображения предпросмотра в карточке документа создается отдельная вкладка с контролом предпросмотра. Для этого в событии открытия формы сохраним в параметр признак того, что сущность открыта из нашей вычисляемой папки, для этого необходимо получить из контекста вызова 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();
  }
}

 

5. Фильтрация документов

Теперь осталось настроить фильтрацию документов из вычисляемой папки по свойству "Договор". Оказалось, что если получать элементы, хранящиеся в папке, через 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+

Авторизуйтесь, чтобы написать комментарий