Кастомные формы задач
Любые задачи в системе ELMA имеют форму представления по умолчанию - она генерируется автоматически. В большинстве случаев стандартные формы представления бывают удобны, к тому же при внедрении системы не требуется тратить время на их создание, однако иногда требуется отображать задачи иным образом, когда необходима разметка страницы, отличная от стандартной. В этом случае используются кастомные формы задач. Кастомные формы могут быть созданы не только для задач, но и для документов, объектов CRM и других объектов системы.
В данной статье мы подробно остановимся на том, как можно создать свою собственную форму задачи в бизнес-процессе.
Для начала необходимо создать файл *.cshtml в папке ...\ELMA3-Standart(Express)\UserConfig\WebApplication. Более подробно о создании и месторасположении файла описано здесь .
Теперь открываем файл в любом текстовом редакторе.
Так как формы создаются с помощью разметки .Net Razor, мы можем использовать HTML-разметку при создании формы.
Чтобы создать новую форму задачи в процессе необходимо ввести следующее пространство имен:
1 | @ using EleWise.ELMA.BPM.Web.Tasks.Models @ using (var data = new ObjectViewData( this , Model.Entity)) { } |
где:
1 2 | @ using EleWise.ELMA.BPM.Web.Tasks.Models – необходимо для отображения задачи в процессе @ using (var data = new ObjectViewData( this , Model.Entity)) – необходимо для правильного отображения переменных и корректной работы скриптов в ELMA |
Вся остальная разметка выполнятся между фигурных скобок.
Рассмотрим основные примеры отображения контекстных переменных на форму:
1 2 3 4 | @Html.Caption – название добавляемого поля @Html.EditorOrDisplay – добавление редактируемого поля @Html.Display – добавление нередактируемого поля @Html.EditableProperty – вывод атрибута с названием @Html.Property – вывод переменной в режиме «Только для чтения» @Html.Editor - вывод поля редактирования (без названия). ( "Entity.<название атрибута>" , a => a.Container( "div" )) – добавление самого поля |
Переменная типа "блок" отображается так же, как и остальные контекстные переменные:
1 | @Html.EditableProperty( "Entity.blok" ) |
При этом можно выводить не все свойства блока, а только добавленные в контекст этой задачи, делается это так:
1 2 | <table> @Html.Property( "Entity.blok" , a => { a.TablePartParentId = Model.Entity.Id; a.ViewProviderUid = EleWise.ELMA.Workflow.Web.Integration.WorkflowTaskObjectViewItemProvider.UID; a.ViewItemId = Model.Task.Id.ToString(); }) </table> |
Ниже приведен пример кастомной формы задачи:
Рис. 1. Пример кастомной формы задачи
В данном примере реализованы:
- Раскрывающийся список.
- Разметка полей и названия атрибутов.
- Таблица, при заполнений которой, динамически подсчитывается итог.
- Раскрывающийся список:
1 2 3 4 5 6 | @(Html.CollapsiblePanel() <span style= "color: #006400;" > // добавляем раскрывающийся список </span>.Id(ViewData.TemplateInfo.GetFullHtmlFieldId("FIO")) <span style= "color: #006400;" > // присваиваем ей ID ("FIO")</span>.Header(SR.T("ФИО")).SaveState(false) <span style= "color: #006400;" > //указываем название панели, а так же будет ли сохраняться раскрытие панели или нет </span>.Class("Gray_Input_Seддparator").Expanded(true) <span style= "color: #006400;" > // указываем цвет панели </span>.Content(@<text><div style="padding: 5px;"> <span style= "color: #006400;" > // настраиваем отступы </span></div></text>).Render()) <span style="color: #006400;">// закрывающие теги раскрывающегося списка </span> |
- Разметка полей и названия атрибутов:
1 2 3 4 5 6 7 8 9 10 11 | <tr> <td colspan= "2" align= "center" > <div style= "float:left; width: 350px;" > <span style= "color: #006400;" > // выравниваем по левому краю, и задаем ширину поля </span><b> @Html.Caption( "Entity.Familiya" , a => a.Container( "div" )) <span style= "color: #006400;" > //добавляем поле с названием атрибута, при этом название берётся из Elma </span></b> @Html.EditorOrDisplay( "Entity.Familiya" , a => a.Container( "div" )) /<span style= "color: #006400;" > // добавляем само поле для заполнения. EditorOrDisplay - указывает на то что, поле доступно для редактирования </span> @Html.Caption( "Entity.Imya" , a => a.Container( "div" )) @Html.EditorOrDisplay( "Entity.Imya" , a => a.Container( "div" )) Отчество <span style="color: #006400;">// еще один вариант названия поля, при этом не важно, как это поле будет называться в системе Elma </span> @Html.EditorOrDisplay( "Entity.Otchestvo" , a => a.Container( "div" )) </div> <div style= "float:left; width: 700px;" > <span style= "color: #006400;" > // добавляем следующий столбец, при этом назначаем ширину данного поле в 700px. </span><b> @Html.Caption( "Entity.FIO" , a => a.Container( "div" )) </b> @Html.EditorOrDisplay( "Entity.FIO" , a => a.Container( "div" )) </div> </td> </tr> |
Таблица, при заполнении которой, динамически подсчитывается итог:
1 2 3 4 | <TR> <TD BGCOLOR= "#42ec93" STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <span style= "color: #006400;" > // Выполняем заливку, настраиваем толщину, отступ, а так же стиль границы </span> </TD> <TD> @Html.EditorOrDisplay( "Entity.K1" , a => a.Container( "div" )) <span style= "color: #006400;" > // Добавление редактируемого поля </span> </TD> </TR> |
Внимание!
Для того чтобы автоматически получить Итоги (использовано в нашем примере), достаточно написать сценарий в ELMA.
1 | context.I1 = context.K1*context.S1; context.I2 = context.K2*context.S2; context.Itog= context.I1+context.I2; |
То есть те сценарии, которые работают в стандартной форме, будут работать и с разметкой Razor при условии что добавлено:
1 2 | @ using (var data = new ObjectViewData( this , Model.Entity))<span style="font-size: 12px; line-height: 1.4em; color: #333333; font-family: Tahoma;"> </span> |
Окончательный вариант выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | @ using EleWise.ELMA.BPM.Web.Tasks.Models @ using EleWise.ELMA.Web.Mvc.Html.Forms @ using (var data = new ObjectViewData( this , Model.Entity)) { @(Html.CollapsiblePanel() .Id(ViewData.TemplateInfo.GetFullHtmlFieldId( "FIO" )) .Header(SR.T( "ФИО" )).SaveState( false ) .Class( "Gray_Input_Separator" ).Expanded( true ) .Content(@<text> <div style= "padding: 5px;" > <table> <tr> <td colspan= "2" align= "center" > <div style= "float:left; width: 350px;" > <b> @Html.Caption( "Entity.Familiya" , a => a.Container( "div" )) </b> @Html.EditorOrDisplay( "Entity.Familiya" , a => a.Container( "div" )) @Html.Caption( "Entity.Imya" , a => a.Container( "div" )) @Html.EditorOrDisplay( "Entity.Imya" , a => a.Container( "div" )) Отчество @Html.EditorOrDisplay( "Entity.Otchestvo" , a => a.Container( "div" )) </div> <div style= "float:left; width: 700px;" > <b> @Html.Caption( "Entity.FIO" , a => a.Container( "div" )) </b> @Html.EditorOrDisplay( "Entity.FIO" , a => a.Container( "div" )) </div> </td> </table> </div> </text>).Render()) @(Html.CollapsiblePanel() .Id(ViewData.TemplateInfo.GetFullHtmlFieldId( "Table" )) .Header(SR.T( "Таблица" )).SaveState( true ) .Class( "Gray_Input_Separator" ).Expanded( false ) .Content(@<text> <div style= "padding: 5px;" > <TABLE> <TR> <TD> </TD> <TD BGCOLOR= "#42ec93" STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P ALIGN=CENTER><FONT COLOR= "#ffffff" ><FONT SIZE=3><B>Количество</B></FONT></FONT></P> </TD> <TD BGCOLOR= "#42ec93" STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P ALIGN=CENTER><FONT COLOR= "#ffffff" ><FONT SIZE=3><B>Сумма</B></FONT></FONT></P> </TD> <TD BGCOLOR= "#42ec93" STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P ALIGN=CENTER><FONT COLOR= "#ffffff" ><FONT SIZE=3><B>Итог</B></FONT></FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD BGCOLOR= "#00b0f0" STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P><FONT COLOR= "#ffffff" ><FONT SIZE=3><SPAN LANG= "en-US" ><B>1</B></SPAN></FONT></FONT></P> </TD> <TD> @Html.EditorOrDisplay( "Entity.K1" , a => a.Container( "div" )) </TD> <TD> @Html.EditorOrDisplay( "Entity.S1" , a => a.Container( "div" )) </TD> <TD STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P ALIGN=CENTER>@Html.Display( "Entity.I1" , a => a.Container( "div" )) </p> </TD> </TR> <TR VALIGN=TOP> <TD BGCOLOR= "#00b0f0" STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P><FONT COLOR= "#ffffff" ><FONT SIZE=3><SPAN LANG= "en-US" ><B>2</B></SPAN></FONT></FONT></P> </TD> <TD> @Html.EditorOrDisplay( "Entity.K2" , a => a.Container( "div" )) </TD> <TD> @Html.EditorOrDisplay( "Entity.S2" , a => a.Container( "div" )) </TD> <TD STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P ALIGN=CENTER>@Html.Display( "Entity.I2" , a => a.Container( "div" )) </p> </TD> </TR> <TR VALIGN=TOP> <TD> </TD> <TD> </TD> <TD ALIGN=right> <b> Итог: </b> </TD> <TD STYLE= "border: 1px solid #00000a; padding: 0in 0.08in" > <P ALIGN=CENTER>@Html.Display( "Entity.Itog" , a => a.Container( "div" )) </p> </TD> </TR> </TABLE> </div> </text>).Render()) } |