...

Кастомизация задач с помощью Razor

Тема в разделе "Примеры реальных проектов", создана пользователем dreyman_g, 30 мар 2017.

Метки:
  1. dreyman_g

    dreyman_g New Member

    Добрый день!
    Использование Razor-форм может значительно расширить функционал задач, но в базе знаний это рассмотрено достаточно поверхностно. Поэтому и предлагаю в данной теме обмениваться полезными решениями, которые помогут лучше реализовать потенциал Razor.
     
  2. dreyman_g

    dreyman_g New Member

    Недавно техподдержка подсказала как вывести на форму предпросмотр документа. Это удобно, когда в задаче нужно просто ознакомиться с документом. 2 варианта:
    1) Через Razor-форму переменной "Файл"(Не подходит для CE):
    1. Добавьте в процесс контекстную переменную с типом данных "Файл"(системный)
    2. Поместите в процесс сценарий, который запишет в эту переменную файл из текущей версии выбранного документа:
    context.Fayl = context.Dokument.CurrentVersion.File;
    3. На форме задачи в конструкторе форм добавьте новую вкладку,например,"Предпросмотр" или добавьте на форму обычную колонку.
    4. Добавьте на эту вкладку/колонку значение свойства "Файл" и установите ему галочку "Только чтение".
    5. В настройках поля Файл на вкладке "Системные" в поле "Форма Razor" добавьте новую форму,текст формы
    @inherits ViewItemControl<PropertyViewItem, object, BinaryFile>
    @using EleWise.ELMA.Files
    @using EleWise.ELMA.Model.Views
    @using EleWise.ELMA.Web.Mvc.Views.ViewItem
    @Html.Partial("Previews/PreviewPanelControl")


    2) Через Razor-форму задачи:
    В данном методе уже придется разрабатывать форму задачи целиком в Razor, но зато можно использовать любой тип документа без создания дополнительной переменной типа Файл. Код достаточно простой
    @using EleWise.ELMA.Documents.Models
    @using EleWise.ELMA.Documents.Docflow;
    @{
    var document = ((IDocument)((dynamic)Model.Entity).Document);
    }
    @Html.Partial("Previews/PreviewPanelControl", document.CurrentVersion.File)

    ,где Document -это название контекстной переменной типа Документ.
     
    Последнее редактирование: 30 мар 2017
    3 это нравится
  3. dreyman_g

    dreyman_g New Member

    В данный момент стоит еще одна задача: реализовать на форме кнопку, по нажатию которой выполнялся бы определенный код или лучше один из сценариев процесса. Может кто-нибудь помочь?
     
  4. В CE или стандарт?
     
  5. pushkarev

    pushkarev Active Member

    А у вас какая редакция CE или коммерческая?
    Если коммерческая, то с помощью конструктора форм можно легко создавать кнопки и при их нажатии вызывать сценарии процесса. Можете посмотреть как это реализовано в списке изменений версии 3.8.6: https://www.elma-bpm.ru/kb/article-819.html раздел пользовательский интерфейс.
    Как добавить кнопку в ELMA CE используя Razor сразу не подскажу нужно поэкспериментировать.
     
  6. dreyman_g

    dreyman_g New Member

    Версия коммерческая, но конструктор форм не подходит из-за ряда требований, которые только в разор получается реализовать.
     
    Последнее редактирование: 30 мар 2017
  7. pushkarev

    pushkarev Active Member

    А точно не подходит? В конструкторе форм же можно добавлять Razor разметку с помощью панелей. Я например всегда использую конструктор форм, а если нужно вставить что-нибудь нестандартное, вставляю панель с Razor кодом. Вам такой кейс не подходит?
     
  8. А вот так в задаче согласования можно сделать несколько панелей с предпросмотром и передавать в него файл из документа, текущей версии, аттачмента и т.п.
    Например нужно сначала вывести предыдущую версию, а ниже текущую. Или договор и приложение и т.п.

    Ложим сюда файлики ...\UserConfig\WebApplication\Modules\EleWise.ELMA.Documents.Docflow.Web\Views\Approvement - это новые файлы, смотрим во вложении

    Потом вот в этом файлике ...UserConfig\WebApplication\Modules\EleWise.ELMA.Documents.Docflow.Web\Views\Shared\Approvement\ExecuteTabs.cshtml - это костомизируем стандартный файл путем добавления таких строчек:
    ...
    @(TabPanel(Html.GenerateName()).Items(tabs =>
    {
    BinaryFile f = null; //тут объявляем переменную куда будем помещать файл 1
    BinaryFile f1 = null; //тут объявляем переменную куда будем помещать файл 2
    tabs.Add(new TabPanelItem
    {
    ...

    а потом ниже заполняем эту переменную файлом

    @if (Model.Entity.Items.First().Document.TypeUid.ToString() == "8505a77f-3a5d-4d7f-a35f-bfb26549c1a9") //тут проверяем что в нашей задаче согласования сейчас документ с типо SuperDocument
    {
    SuperDocument sd = EntityManager<SuperDocument>.Instance.LoadOrNull(Model.Entity.Items.First().Document.Id);

    if (sd.Atribut_s_Documentom != null && sd.Atribut_s_Documentom.CurrentVersion != null && sd.Atribut_s_Documentom.CurrentVersion.File != null)
    {
    f = sd.Atribut_s_Documentom.CurrentVersion.File;
    }

    if (f != null)
    {
    <tr>
    <td>
    @Html.Partial("Approvement/ResolverOne", f, new ViewDataDictionary(ViewData) { { "showFile", true }, { "Name", "Файл" }, { "Id", "1" } })
    </td>
    </tr>
    }
    //подобным макаром заполняем f2, только например из атрибута не с документом, а с файлом или из вложения с документом
    if (f2 != null)
    {
    <tr>
    <td>
    @Html.Partial("Approvement/ResolverOne", f2, new ViewDataDictionary(ViewData) { { "showFile", true }, { "Name", "Файл 2" }, { "Id", "2" } })
    </td>
    </tr>
    }

    { "showFile", true } - true панель будет развернутой, false панель будет свернутой
     

    Вложения:

    1 это нравится
  9. В коммерческой можно и стандартный объект кнопка добавить и даже в него сценарий повесить. Да вот беда он работает только на форме редактирования. Если кнопку на форме просмотра сделать и сценарий повесить. Сценарий даже выполниться и даже на форме отобразятся изменения, только они не сохраняться ;-( и после обновления все пропадет
     
  10. Вот так получается:
     

    Вложения:

  11. pushkarev

    pushkarev Active Member

    Ну тут как я понял из вопроса речь о форме задачи и там такой проблемы не будет.
    А вот на счет того что данные не сохранятся после нажатия на кнопку, тут я так думаю проблема не в форме, а в контроллере. Я думаю, что он данные с формы просто не сохраняет, даже если пользователь туда что-нибудь вводит.
     
  12. dreyman_g

    dreyman_g New Member

    Подходит, но несколько отдельных шаблонов приходится делать, когда все в одном файле - удобнее.

    Да, интересно, на форме уже выполненной задачи с кнопкой обратная ситуация - при нажатии сценарий выполняется.
     
  13. yambr

    yambr Member

    Ребята делайте пожалуйста отдельные темы каждую фичу чтобы по названию можно было понять полезно это или нет в конкретной ситуации

    yambr.ru вот тут есть пара полезных вещей у кого есть свободное время можете на форум покидать
     
    3 это нравится
  14. AlexKutler

    AlexKutler New Member

  15. BRoman

    BRoman New Member

    Добрый день! Подскажите, как на форму в панель добавить табличное представление объекта?
    И можно ли из справочника при клике по объекту сразу попадать на форму редактирования, а не просмотра?
     

Поделиться: