<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Efficient Stencil Development for Alfresco Process Services in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/efficient-stencil-development-for-alfresco-process-services/m-p/152123#M106800</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;One of the most important elements in BPMN and thus also in Alfresco Process Services (APS) is the user task. To facilitate the interaction between business processes and human actors, APS allows process designers to create&lt;/SPAN&gt; &lt;SPAN style="color: #172b4d; font-size: 11.5pt;"&gt;&lt;EM&gt;forms,&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;i.e. user interfaces for user tasks. APS provides a set of predefined UI controls like text input, drop down menu or content of a process variable.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="background: white; margin: 7.5pt 0cm .0001pt 0cm;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Custom form field types can be created by using custom&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color: #172b4d; font-size: 11.5pt;"&gt;&lt;EM&gt;form stencils&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;. APS includes an easy-to-use form editor for&amp;nbsp;the creation of custom form stencils. While the editor provides a convenient and fast way for creating new form field types for simple and small business cases, developing complex form stencils can be a pain.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;This blog post presents an approach for the efficient development of custom form stencils.&amp;nbsp;The approach describes faster and easier iterations when changing code for stencils and testing it. At the end, there is no need to publish the app definition, start a new process, start a user tasks and reconstruct the form data in order to see the result of the changes.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;The overall idea of the approach is to outsource the code for the design (i.e. HTML) and the controller (i.e. AngularJS) of a form field to external files.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;H2&gt;The Approach&lt;/H2&gt;&lt;P style="background: white; margin: 7.5pt 0cm .0001pt 0cm;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;In the following steps we will create a new custom form field for creating notes.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 1: Create a new set of custom stencils called “DynamicStencils”.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 2: Create a new form field called “Notes”.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 3: Add the following HTML snippet to the “Form runtime template” in the form field configuration:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&lt;BR /&gt;&amp;lt;dynamic-stencil stencil="notes"&amp;gt;&amp;lt;/dynamic-stencil&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;The snippet acts like a place holder that is later replaced dynamically by the HTML content defined in an external file.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG __jive_id="25259" class="image-5 jive-image j-img-original" src="https://connect.hyland.com/legacyfs/online/alfresco/25259_pastedImage_16.png" /&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 4: Save the custom stencils.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 5: Create a new form (e.g. call it “DynamicStencilForm”) based on the “DynamicStencils” package and add the previously created “Notes” form field to the form:&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG __jive_id="25260" class="image-6 jive-image j-img-original" src="https://connect.hyland.com/legacyfs/online/alfresco/25260_pastedImage_17.png" /&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 6: Create a new process (e.g. call it “DynamicStencilProcess”) with a user task and reference the previously created “DynamicStencilForm”:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG __jive_id="25261" class="image-7 jive-image j-img-original" src="https://connect.hyland.com/legacyfs/online/alfresco/25261_pastedImage_18.png" /&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 7: Create an app that includes the process “DynamicStencilProcess”, save and publish the app.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 8: Start a process and open the created user task. You see the following form:&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&lt;IMG __jive_id="25258" class="jive-image image-4 j-img-original" src="https://connect.hyland.com/legacyfs/online/alfresco/25258_pastedImage_15.png" /&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;What do we see...? Nothing! Don´t worry, this is expected since our form runtime template only defines a placeholder (see step 3). In the next steps, we replace the placeholder with HTML content at runtime and add logic (i.e. an AngularJS controller) to the form field where both the HTML and the AngularJS controller code is located in external files.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin: 0cm; margin-bottom: .0001pt; background: white;"&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 9: Prepare a script to render form fields based on HTML content located in an external file:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Create a new file called &lt;EM&gt;dynamicStencil.js&lt;/EM&gt; with the following content in the folder &lt;EM&gt;webapps/activiti-app/scripts&lt;/EM&gt; located in your activiti-app web application:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;angular.module('activitiApp')&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;.directive('dynamicStencil', function($rootScope, $compile) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;template : '&amp;lt;div id="{{stencilName}}DynamicStencil" ng-include="getContentUrl()"&amp;gt;&amp;lt;/div&amp;gt;',&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;link : function(scope, element, attrs) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scope.stencilName = attrs.stencil;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scope.getContentUrl = function() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return scope.stencilName;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;});&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;This file needs to be created only once.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 10: Now add the &lt;EM&gt;dynamicStencil.js&lt;/EM&gt; file to the list of additional web resources that are loaded by the browser for an APS application (see also&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt;"&gt;&lt;A href="https://docs.alfresco.com/process-services1.9/topics/custom_web_resources.html" rel="nofollow noopener noreferrer"&gt;https://docs.alfresco.com/process-services1.9/topics/custom_web_resources.html&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;). Open the file &lt;EM&gt;webapps/activiti-app/scripts/app-cfg.js&lt;/EM&gt; and add the following snippet at the end of the file contents:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;ACTIVITI.CONFIG.resources = {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;'workflow' : [&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'tag' : 'script',&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'type' : 'text/javascript',&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'src' : ACTIVITI.CONFIG.webContextRoot&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;+ '/scripts/dynamicStencil.js?v=1.0'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;]&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;};&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 11: Define the actual form runtime template: open the file &lt;EM&gt;webapps/activiti-app/workflow/index.html&lt;/EM&gt; located in the activiti-app web application and add the following AngularJS ng-template to the body tag:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;lt;!-- Dynamic Stencil Templates --&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;lt;script type="text/ng-template" id="&lt;STRONG&gt;notes&lt;/STRONG&gt;"&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div ng-controller="notesController"&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="input-group" style="width: 100%"&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;ng-show="!(field.type === 'readonly')"&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;textarea class="form-control" rows="3" style="resize: none;"&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;ng-model="currentNote" placeholder="Write some note ..."&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;span class="input-group-addon btn btn-primary" ng-click="addNote()"&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;span class="glyphicon glyphicon-plus" aria-hidden="true"&amp;gt;&amp;lt;/span&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/span&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="list-group"&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div ng-repeat="note in field.value | reverse track by $index"&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;class="list-group-item list-group-item-action flex-column align-items-start active"&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="d-flex w-100 justify-content-between"&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;small&amp;gt;{{note.fullName}} - {{note.date}}&amp;lt;/small&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p class="mb-1"&amp;gt;{{note.content}}&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Please note that the id of the ng-template must be the same as defined in the “stencil” attribute in step 3.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Go back to your browser and refresh the page. You should now see the rendered HTML defined in the ng-template:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&lt;IMG __jive_id="25262" class="jive-image image-8 j-img-original" src="https://connect.hyland.com/legacyfs/online/alfresco/25262_pastedImage_22.png" /&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Great! However, the logic for the form field is still missing.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 12: Add an AngularJS controller to the form field by creating a new file &lt;EM&gt;webapps/activiti-app/workflow/dynamic-stencils/notes-ctrl.js&lt;/EM&gt; with the following content:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;function notesController($rootScope, $scope, $http, $filter) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var getDatetime = function() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (new Date).toLocaleFormat("%A, %B %e, %Y");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Register this controller to listen to the form extensions methods&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.registerCustomFieldListener(this);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Deregister on form destroy&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.$on("$destroy", function handleDestroyEvent() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.removeCustomFieldListener(this);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Parse JSON string content&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!$scope.field.value) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.field.value = [];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else if (typeof $scope.field.value === "string") {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.field.value = JSON.parse($scope.field.value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (error) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.field.value = [];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.error(error);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Will be triggered before the task is saved&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.taskBeforeSaved = function(taskId, form, data, scope) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// If a note has been entered however the user did not click on the "+"&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;button, save the note anyway&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.addNote();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Save the content of the form field as JSON&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.values.notesfield = angular.toJson($scope.field.value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Will be triggered before the form is completed&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.formBeforeComplete = function(form, outcome, scope) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// If a note has been entered however the user did not click on the "+"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// button, save the note anyway&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.addNote();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Save the content of the form field as JSON&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.field.value = angular.toJson($scope.field.value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Scope function for adding a new note to the scope&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.addNote = function() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add the note only if it is not undefined and not empty&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($scope.currentNote) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Create a new note object&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var newNote = {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"userID" : $scope.$root.account.id,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"fullName" : $scope.$root.account.fullname,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"date" : $filter("date")(new Date(), "dd.MM.yyyy HH:mm"),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"content" : $scope.currentNote&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add the new note to the list of notes&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.field.value.push(newNote);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Clear the text field&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scope.currentNote = "";&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;// Filter that is used to reverse the order of the notes (force that the&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;newest note is at the top of the list)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;function ReverseFilter() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return function(items) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (items) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return items.slice().reverse();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return items;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;angular.module('activitiApp').filter('reverse', ReverseFilter).controller(&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;'notesController', notesController);&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;The file defines the logic for our notes form field.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 13: Similar to step 8, we need to add the controller file to the list of additional web resources. For this, add a new entry in the file &lt;EM&gt;webapps/activiti-app/scripts/app-cfg.js&lt;/EM&gt;:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;ACTIVITI.CONFIG.resources = {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'workflow' : [&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'tag' : 'script',&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'type' :&amp;nbsp;'text/javascript',&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'src' : ACTIVITI.CONFIG.webContextRoot&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;+ '/scripts/dynamicStencil.js?v=1.0'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'tag' : 'script',&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'type' : 'text/javascript',&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'src' : ACTIVITI.CONFIG.webContextRoot&lt;/SPAN&gt; &lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;+ '/workflow/dynamic-stencils/notes-ctrl.js?v=1.0'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;};&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 11.5pt; color: #172b4d;"&gt;Step 14: Congratulations, t&lt;/SPAN&gt;&lt;SPAN style="color: #24292e; background: white;"&gt;hat's it! Now you can edit/adapt both files (the HTML design and the AngularJS controller). Changes are directly shown after refreshing the browser.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;H2&gt;&lt;SPAN style="background: white;"&gt;From Development to Production&lt;/SPAN&gt;&lt;/H2&gt;&lt;P&gt;&lt;IMG __jive_id="25263" class="image-9 jive-image" src="https://connect.hyland.com/legacyfs/online/alfresco/25263_pastedImage_23.png" /&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #24292e; background: white;"&gt;The outsourced code of this approach can also be used in production&lt;/SPAN&gt;&lt;SPAN style="color: #24292e; background: white;"&gt;. However, please note that the approach also levers out&lt;/SPAN&gt; &lt;SPAN style="color: #24292e; background: white;"&gt;the actual form field design process of Alfresco Process Service. Normally, defining the code for the design and controller of a form field in the built-in stencil editor is bundled in the final app definition zip. This connects the current version of the code to the current version of the process definition. In case of a new version of the process definition and maybe of the form field code, old versions of the process definition are still using the “old” form field code. With the approach presented, the defined code in the external files is always used for all versions of a process definition. This means that you need to ensure backward compatibility of your code (similar to the concept of service tasks defined in Java).&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #24292e; background: white;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #24292e; background: white;"&gt;Of course, you can also use this approach for development only: after you have reached a state of your form field that you define as “final”, you can just copy and paste the design and controller code into the built-in stencil editor and process it as usual.&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 04 Feb 2019 12:34:17 GMT</pubDate>
    <dc:creator>ladenberger</dc:creator>
    <dc:date>2019-02-04T12:34:17Z</dc:date>
    <item>
      <title>Efficient Stencil Development for Alfresco Process Services</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/efficient-stencil-development-for-alfresco-process-services/m-p/152123#M106800</link>
      <description>One of the most important elements in BPMN and thus also in Alfresco Process Services (APS) is the user task. To facilitate the interaction between business processes and human actors, APS allows process designers to create forms,&amp;nbsp;i.e. user interfaces for user tasks. APS provides a set of predefined</description>
      <pubDate>Mon, 04 Feb 2019 12:34:17 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/efficient-stencil-development-for-alfresco-process-services/m-p/152123#M106800</guid>
      <dc:creator>ladenberger</dc:creator>
      <dc:date>2019-02-04T12:34:17Z</dc:date>
    </item>
  </channel>
</rss>

