Documentation
Built by Maven

Custom Forms

With Imixs-Office-Workflow you can create forms completely model-based. No programming knowledge in HTML or Java Script is required. The custom form component enables you to design your forms at runtime. The definition of a custom form is done within the Imixs-BPMN modeler. To activate this feature you need to add the from “custom” into the section “Application -> Input Form” of your task element.

form_panel#custom

The definition of your custom form is defined by a “Data Object Element” with an association to your task element:

The Form Definition

The XML definition contains sections and items:

<?xml version="1.0"?>
<imixs-form>
  <imixs-form-section label="Controlling">
    <item name="description" type="textarea"
        label="Short Description" />
  </imixs-form-section>
  <imixs-form-section>
    <item name="details" type="html" label="Description" />
  </imixs-form-section>
</imixs-form>

The following common input formats are supported:

Text Input

<item name="description" type="text"
        label="Topic" />

Textarea Input

<item name="description" type="textarea"
        label="Description" />

HTML/RichText Input

<item name="description" type="html"
        label="Description" />

Date Input

<item name="invoice.date" type="date"
        label="Date" />

Select Boxes

You can also create different type of select boxes with predefined values:

 <item name="invoice.currency" type="selectOneMenu" 
	label="Currency:"
	options="EUR;CHF;SEK;NOK;GBP;USD" />

You can choose one of the following types for select boxes:

  • selectOneMenu - a dropdown menu
  • selectBooleanCheckbox - a single checkbox
  • selectManyCheckbox - a list of checkboxes (layout=line direction)
  • selectOneRadio - radio buttons (layout=line direction)

selectManyCheckbox and selectOneRadio are displayed in line direction per default. If you want to display them in page direction use:

  • selectManyCheckboxPageDirection - a list of checkboxes (layout=page direction)
  • selectOneRadioPageDirection - radio buttons (layout=page direction)

Required Inputs

With the tag ‘required’ a mandatory input is defined:

<item name="_date" type="date" required="true"
        label="Date" />

Form Sections

A custom form is separated by sections. A section can have an optional label and up to 3 columns:

 ....
 <imixs-form-section label="Controlling" columns="2">
 	.....
 </imixs-form-section>
 ....

Custom Input Fields

It is also possible to define more complex input fields with the item type ‘custom’

    <item name="mycustomitem" path="[PART_NAME]" type="custom" label="My Custom Label" required="true" readonly="false" />

Note: A custom item is defined by a JSF ui:composition placed in the directory /pages/workitems/parts/:

/pages/workitems/parts/[PART_NAME].xhtml

The mandatory path attribute contains the path for JSF component relative to the /pages/workitems/parts/ directory with the .xhtml extension. You can also use sub directories to group custom input items.

/pages/workitems/parts/[SUB_DIR]/[PART_NAME].xhtml

See the following example of a custom input field definition:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
	xmlns:f="http://xmlns.jcp.org/jsf/core"
	xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
	xmlns:a="http://xmlns.jcp.org/jsf/passthrough"
	xmlns:h="http://xmlns.jcp.org/jsf/html">
	<span class="custom-class"> 
	   <h:inputText style="border:2px solid blue;" 
	                value="#{workitem.item[item.name]}"
	                a:placeholder="enter custom data..." 
	                rendered="#{!readonly}" />
	    <h:outputText style="border:2px solid blue;" 
	                value="#{workitem.item[item.name]}"
	                rendered="#{readonly}" />
	</span>
</ui:composition>

Note: This custom input form uses also the attributes ‘readonly’ and ‘required’ to determine if the input component is editable or readonly.

Custom Input Section

As an alternative to the custom input fields you can also define custom sections. A custom section defines a complete form section and is used for more complex input forms including ajax.

  <imixs-form-section label="My Custom section" path="sub_custom_form" > 

Note: A custom section is defined by a JSF ui:composition placed in the directory:

/pages/workitems/forms/

See the following example of a custom input field definition:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
	xmlns:f="http://xmlns.jcp.org/jsf/core"
	xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
	xmlns:h="http://xmlns.jcp.org/jsf/html"
	xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs"
	xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty">
	<!-- show outgoing references -->
	<div class="imixs-form-section">
		<dl>
			<dt class="imixs-no-print">
				<h:outputText value="#{message['form.reference.outgoing']}" />
			</dt>
			<dd>
				<marty:workitemLink workitem="#{workitem}" readonly="#{readonly}" 
					filter="" />
			</dd>
		</dl>
	</div>
</ui:composition>

Note: Also in a custom section you can use the attribute ‘readonly’ to determine if the input components are editable or readonly.

Ajax Support

Within a custom form part or a custom section you can also trigger Ajax events refreshing other form parts or sections within the same form definition. For this behaviour you can refer to the clientId of the component ‘formComponents’. See the following example:

	<h:selectOneMenu 
		required="#{empty required?false:required}"
		value="#{workflowController.workitem.item['space.ref']}">
			<f:selectItem itemLabel="a"></f:selectItem>
			<f:selectItem itemLabel="b"></f:selectItem>
			<f:selectItem itemLabel="c"></f:selectItem>
			
		<!-- trigger refresh over all components -->	
		<f:ajax render="#{formComponents.clientId}"  />
		
	</h:selectOneMenu>

In this example choosing a new option from the select menu will refresh all other form components.

The customFormComponents

If you just want to update the elements of the custom form you can refere to the custom forms section by the binding customFormComponents

<h:selectOneMenu value="#{workitem.item['myselection']}">
		<f:selectItem itemLabel=""></f:selectItem>
		.....
		<f:ajax render="#{customFormComponents.clientId}"/>
</h:selectOneMenu>

This will trigger a render event only on the parts within the customForm Container