Resource Control Display Configuration XML Reference

Applies To: Forefront Identity Manager 2010

Resource Control Display Configurations (RCDC) are user defined resources that can control how other resources in the FIM 2010 data store are displayed in the UI to the end user. Each RCDC resource contains an XML configuration file that may be modified to add, modify, or remove UI text and UI controls. While FIM 2010 provides several default RCDC resources, custom RCDC resources may also be created for custom resources. For more information on using the RCDC UI in the FIM Portal, see Introduction to Resource Control Display previously in this document.

Basic Structure

The XML data for a RCDC resource consists of the single XML element ObjectControlConfiguration.

noteNote
For the full XSD schema, see Appendix A: XSD Schema in this document.

The following is the XSD schema for the ObjectControlConfiguration Element:

<xsd:element name="ObjectControlConfiguration">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:ObjectDataSource" minOccurs="0" maxOccurs="32"/>
               <xsd:element ref="my:XmlDataSource" minOccurs="0" maxOccurs="32"/>
               <xsd:element ref="my:Panel"/>
               <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
          </xsd:sequence>
          <xsd:attribute ref="my:TypeName"/>
          <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
     </xsd:complexType>
</xsd:element>

The ObjectControlConfiguration element contains:

  1. ObjectDataSource: This element specifies the typename of a datasource class that is used by the Resource Control (RC). See the Data Sources section in this document for a description and the schema definition. An ObjectControlConfiguration element can contain up to 32 nodes of the ObjectDataSource element.

  2. XmlDataSource: This is a simple datasource that is most commonly used to specify the look and feel of a summary page. See the Data Sources section in this document for a description and the schema definition. An ObjectControlConfiguration element can contain up to 32 nodes of the XmlDataSource element.

  3. Panel: In FIM 2010, the customer can customize the layout of the RCDC page by modifying elements inside of Panel elements. See the Panel section in this document for more details. An ObjectControlConfiguration element must have precisely one Panel element.

  4. Events: In FIM 2010, since the customers cannot provide customized code behind, this feature is limited. This is the events that a panel or a control can emit based on a state change. See the Event section in this document for more details. An ObjectControlConfiguration element can contain optionally one Event element. In general, use of custom Event is not supported in FIM.

Data Sources

FIM 2010 uses datasources as a way to bind data to UI components. This helps facilitate separation of the data from the presentation layer. There are two kinds of data sources in Resource Control Display resource configuration data: ObjectDataSource and XmlDataSource.

  • ObjectDataSources specify a .NET class that provides the data to the RC. There is a fixed set of available types of ObjectDataSources provided in FIM 2010 that the administrator can choose to consume when authoring RCDCs.

  • XMLDataSources provide a simple way to structure XML-based data, and as such can be used by customers to provide customized data. The XML data must be specified directly in the RCDC, unless you use the built-in predefined XML structure provided by FIM 2010. The built in XML structure is used for generating summary pages in the RC.

In the RCDC, you can bind these datasources to attributes of the UI controls specified in the RCDC to generate the user interface.

ObjectDataSource

FIM 2010 provides the following common datasource types that are available for all resource types (except where noted):

  • PrimaryResourceObjectDataSource - This represents the FIM 2010 resource that is being created, edited, or viewed. The path in the binding string is the attribute name. Note that the resource type is specified by the TargetObjectType attribute of the RCDC rather than in the RCDC.ConfigurationData attribute.

  • PrimaryResourceDeltaDataSource - This datasource builds the delta XML that compares the original state and the current state of the FIM 2010 resource. The generated delta XML is consumed by the RC Summary control to render the UI for request that the user is submitting.

  • PrimaryResourceRightsDataSource - This data source provides the inline rights for each attribute of the FIM 2010 resource. This enables the RC to determine in advance of submission, what permissions that user has on that attribute, and then render the UI for that attribute appropriately.

  • SchemaDataSource - This data source can be used to access schema-related information such as display name, description, whether or not the attribute is required, as well as resource type information

  • DomainDataSource - This datasource provides an enumeration of domains, based on the domain configuration resources. Note that this datasource can only be used in RCDCs that are for group resources and user resources.

Below is an example RCDC snippet that binds 3 data sources to the UocTextBox control to edit the Description attribute of a group.

<my:ObjectDataSource my:TypeName="PrimaryResourceObjectDataSource" my:Name="object" my:Parameters=""/>
<my:ObjectDataSource my:TypeName="SchemaDataSource" my:Name="schema"/>
<my:ObjectDataSource my:TypeName="PrimaryResourceRightsDataSource" my:Name="rights"/>

     <my:Control my:Name="Description" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=Description.DisplayName}" my:RightsLevel="{Binding Source=rights, Path=Description}">
          <my:Properties>
               <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required}"/>
               <my:Property my:Name="Rows" my:Value="3"/>
               <my:Property my:Name="Columns" my:Value="60"/>
               <my:Property my:Name="MaxLength" my:Value="450"/>
               <my:Property my:Name="Text" my:Value="{Binding Source=object, Path=Description, Mode=TwoWay}"/>
          </my:Properties>
     </my:Control>

XMLDataSource

Using an XMLDataSource allows you to specify custom data that can be consumed by the RCDC for a given resource. In this case the XML data must be specified in the RCDC. Alternatively, this datasource can be used to reference a built-in XML data structure to render the UI for summary pages. You control what type of XMLDataSource to use when you define it in the RCDC.

  • To define a custom XML data source:

    <my:XmlDataSource my:Name="MyCustomData" >
         %insert raw xml here %
    </my:XmlDataSource>
    
  • To use the built in summary control XSL, define the datasource as follows:

    <my:XmlDataSource my:Name="summaryTransformXsl" my:Parameters="Microsoft.IdentityManagement.WebUI.Controls.Resources.DefaultSummary.xsl" />
    If you are creating an RCDC for a custom resource type, you can use this method to automatically render a summary page for that custom resource.

Below is an example to create a summary tab in the RCDC, using the PrimaryResourceDeltaDataSource with the XMLDataSource using the built-in XSL:

<my:ObjectDataSource my:TypeName="PrimaryResourceDeltaDataSource" my:Name="delta" />
<my:XmlDataSource my:Name="summaryTransformXsl" my:Parameters="Microsoft.IdentityManagement.WebUI.Controls.Resources.DefaultSummary.xsl" />

<my:Grouping my:Name="summaryGroup" my:Caption="Summary” my:IsSummary="true">
     <my:Control my:Name="summaryControl" my:TypeName="UocHtmlSummary" my:ExpandArea="true">
          <my:Properties>
               <my:Property my:Name="ModificationsXml" my:Value="{Binding Source=delta, Path=DeltaXml}" /> 
              <my:Property my:Name="TransformXsl" my:Value="{Binding Source=summaryTransformXsl, Path=/}" /> 
          </my:Properties>
     </my:Control>
</my:Grouping>

Alternatively, the user can replace the XmlDataSource element specified above into the following format to define a customized look and feel of a summary page. As a reference, the default FIM 2010 Summary XSL is included in Appendix B: Default Summary XSL in this document.

<my:XmlDataSource my:Name="summaryTransformXsl">
     Insert valid XSL formatted text
</my:XmlDataSource>

Schema for Data Sources

The following is the XSD schema for the two types of data sources:

<xsd:element name="ObjectDataSource">
     <xsd:complexType>
          <xsd:sequence/>
          <xsd:attribute ref="my:TypeName"/>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:Parameters"/>
     </xsd:complexType>
</xsd:element>
<xsd:element name="XmlDataSource">
     <xsd:complexType  mixed="true">
          <xsd:sequence>
              <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:Parameters"/>
    </xsd:complexType>
</xsd:element>

Events

An Event defines the changing state of a Control. The extensibility of this feature is limited, since you cannot write a customized function (Handler) to define what the behavior is after an event is triggered. The same Event element can be used in the Panel element. See the Panel section in this document for more details. The following is the XSD schema for the Event element:

<xsd:element name="Events">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Event" minOccurs="1" maxOccurs="16"/>
          </xsd:sequence>
     </xsd:complexType>
</xsd:element>
<xsd:element name="Event">
     xsd:complexType>
          <xsd:simpleContent>
               <xsd:extension base="xsd:string">
                    xsd:attribute ref="my:Name"/>
                    <xsd:attribute ref="my:Handler"/>
               </xsd:extension>
          </xsd:simpleContent>
     </xsd:complexType>
     </xsd:element>

An Event is an empty element, and has two attributes. Attributes:

  1. Name: This is the unique name of an event. The only supported event in the ObjectControlConfiguration is “Load” event. This event is triggered when the page is first loaded.

  2. Handler: This is the unique name of a handler. When the event is triggered, usually a program method is called to handle the change of the state of the control. In this release of FIM 2010, the following cases are not supported: removing an existing handler from an existing control, creating a new handler, and attaching to an existing or new control.

Sample: This is an example of an Events element.

<my:Events>
    <my:Event my:Name="Load" my:Handler="OnLoad"/>
</my:Events>

Panel

The Panel element is the core element in an RCDC layout. The following is the XSD schema for the Panel element:

<xsd:element name="Panel">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Grouping" minOccurs="1" maxOccurs="16"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:DisplayAsWizard"/>
          <xsd:attribute ref="my:Caption"/>
          <xsd:attribute ref="my:AutoValidate"/>
     </xsd:complexType>
</xsd:element>

This element contains a re-occurring element: Grouping. See the Grouping section in this document for more details. The Panel element contains four attributes:

  1. Name: The name of the Panel. This is a required string type attribute.

  2. DisplayAsWizard: This is currently deprecated. The corresponding VerbContext attribute on the RCDC governs if the resource layout is in wizard mode or tab mode. If it is set to 0 (Create mode), it is also in wizard mode. Otherwise, it is in tab mode. See the Resource Control Display Configuration Step-by-Step guide for more details.

  3. Caption: This is currently deprecated. The user can specify captions for a page by including a Group that contains only header information. See the Grouping section in this document for more details.

  4. AutoValidate: An optional Boolean attribute. When it is set to true, validation is triggered against each control on the current tab. By default, if the attribute is missing, it is set to true. It can be used in combination with the RegularExpression property. See RegularExpression in a later section of this document.

Grouping

The Grouping element defines the overall layout of a Panel. It acts as a container that groups together individual controls into different sections and tabs. The following is the XSD schema for the Grouping element:

<xsd:element name="Grouping">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Control" minOccurs="1" maxOccurs="256"/>
               <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:Caption"/>
          <xsd:attribute ref="my:Description"/>
          <xsd:attribute ref="my:Enabled"/>
          <xsd:attribute ref="my:Visible"/>
          <xsd:attribute ref="my:IsHeader"/>
          <xsd:attribute ref="my:IsSummary"/>
     </xsd:complexType>
</xsd:element>

There are three types of Groupings:

  1. Header Grouping: A Header Grouping is optional, and there can only be one Header Grouping in a Panel. A Header Grouping appears on top of a panel as caption. Only one UocCaptionControl is allowed to be used in this grouping. See the Sample section below for an example of a Header Grouping.

  2. Content Groupings: At least one Content Grouping is required, and there can be multiple Content Groupings in a Panel. A Content Grouping appears as the main content of an RCDC page. Each Content Grouping appears as a tab in the same Panel, and can hold from 1 to 256 controls. See the Sample section below for an example of a Content Grouping.

  3. Summary Groupings: A Summary Grouping is optional, and there can only be one Summary Grouping in a Panel. A Summary Grouping appears as the last tab of a Panel. Only one UocHtmlSummary control can be used in a Summary Grouping to display the changes that the user has made before submission of a request. See the Sample section below for an example of a Summary Grouping.

Each Grouping type contains the following elements:

  1. Help: This element provides help text in a tab. It also allows you to add a link to a help file for the tab.

  2. Control: See the Control section in this document for more detail about this element. Each grouping must have 1 to 256 controls inclusively, depending on the type of the grouping.

  3. Events: See the Event section in this document for more detail about this element. Each grouping can have optionally one Event. The Events supported in a Grouping element are: a.BeforeLeave: This is triggered when the user is ready to leave a tab in a content grouping. b.AfterEnter: This is triggered when the user is ready to enter a tab in a content grouping.

Attributes:

  1. Name: This is the required name of the Grouping. The name must be unique within the panel.

  2. Caption: The caption appears as the header caption in a Header Grouping. It appears as the tab caption of a Content or Summary grouping.

  3. Description: An optional string attribute, it is only functional when used in a Content Grouping. Use this element to give the end user some detail on the information within same tab.

    noteNote
    If this attribute is used in a Summary Grouping, the xml is considered invalid. If this attribute is used in a Header Grouping, the xml is considered valid, but ignored.

  4. Enabled: An optional Boolean attribute, it is set to true when it is missing. If it is set to false, the end user sees a Disabled tab. This attribute is only functional in a Content grouping.

  5. securitySecurity Note
    If this attribute is used in a Summary Grouping, the xml is considered invalid. If this attribute is used in a Header Grouping, the xml is considered valid, but ignored.

  6. Visible: You can hide an RCDC page tab or it’s heading by setting this attribute to false. By default, this optional Boolean type attribute is set to true. This attribute is only functional on a Content Grouping.

    noteNote
    When there is only one Content Grouping in a Panel, this feature will not work. When there is more than one Content Grouping in a Panel, it behaves as described above.

  7. IsHeader: An optional Boolean attribute that defines if the Grouping is a Header Grouping. If the attribute is not specified, it is set to false.

  8. IsSummary: This is an optional Boolean attribute that defines if the Grouping is a Summary grouping. If the attribute is not specified, it is set to false.

Example:

ad60b51e-bae0-4b6e-9fb0-ad07a5c50ad6

The following xml sample code will generate the above Header Grouping. The Header Grouping is the area with the text “Sample Header Grouping”.

<!--Sample for a Header Grouping-->
<my:Grouping my:Name="HeaderGroupingSample" my:IsHeader="true">
     <my:Control my:Name="SampleHeaderCaption" my:TypeName="UocCaptionControl" my:ExpandArea="true" my:Caption="Sample Header Grouping">
          <my:Properties>
               <my:Property my:Name="MaxHeight" my:Value="32"/>
               <my:Property my:Name="MaxWidth" my:Value="32"/>
          </my:Properties>
      </my:Control>
</my:Grouping>
<!--End of Header Grouping Sample-->

Example:

db24a648-40e4-4b99-8c29-89d6ffc1cb6a

The following xml sample code will generate the above Content Grouping. The Content Grouping is the leftmost tab with the text “Sample Content Grouping”.

<!--Sample for a Content Grouping-->
<my:Grouping my:Name="ContentGroupingSample" my:Caption="Sample Content Grouping" my:Description="Some description for content grouping">
     <my:Control my:Name="DisplayName" my:TypeName="UocTextBox" my:Caption="Display name" my:Description="This is the display name of the set.">
          <my:Properties>
               <my:Property my:Name="Required" my:Value="True"/>
               <my:Property my:Name="MaxLength" my:Value="128"/>
               <my:Property my:Name="Text" my:Value="{Binding Source=object, Path=DisplayName, Mode=TwoWay}"/>
          </my:Properties>
     </my:Control>
</my:Grouping>
<!--End of Content Grouping Sample-->

Example:

fc73e02f-dc1d-4d42-a2cd-8169bc8a3d3e

The following xml sample code will generate the above Summary Grouping. The Summary Grouping is the rightmost tab with the text “Summary”.

<!--Sample for a Summary Grouping-->
<my:Grouping my:Name="Summary" my:Caption="Sample Summary Grouping" my:IsSummary="true">
     <my:Control my:Name="SummaryControl" my:TypeName="UocHtmlSummary" my:ExpandArea="true">
          <my:Properties>
               <my:Property my:Name="ModificationsXml" my:Value="{Binding Source=delta, Path=DeltaXml}"/>
               <my:Property my:Name="TransformXsl" my:Value="{Binding Source=summaryTransformXsl, Path=/}"/>
          </my:Properties>
     </my:Control>
</my:Grouping>
<!--End of Summary Grouping Sample-->

Help

The Help element can be optionally included in a Grouping or a Control element. If used in a Grouping, it must be the first element used. It provides text help to the end user to help them understand and input accurate information. The following is the XSD schema for the Help element:

<xsd:element name="Help">
     <xsd:complexType>
          <xsd:sequence/>
          <xsd:attribute ref="my:HelpText"/>
          <xsd:attribute ref="my:Link"/>
     </xsd:complexType>
</xsd:element>

Here is an example:

<my:Help my:HelpText="Some Help Text for Group Basic Info" my:Link="03e258a0-609b-44f4-8417-4defdb6cb5e9.htm#bkmk_grouping_GroupingBasicInfo" />

Controls

A Grouping element contains one or more Control elements. Controls are the main elements in a Resource Control Display Configuration. You can customize the Grouping element by defining the different Control elements that it contains. The following is the XSD schema for the Control element:

<xsd:element name="Control">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:CustomProperties" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Options" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Buttons" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Properties" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:TypeName"/>
          <xsd:attribute ref="my:Caption"/>
          <xsd:attribute ref="my:Enabled"/>
          <xsd:attribute ref="my:Visible"/>
          <xsd:attribute ref="my:Description"/>
          <xsd:attribute ref="my:ExpandArea"/>
          <xsd:attribute ref="my:Hint"/>
          <xsd:attribute ref="my:AutoPostback"/>
          <xsd:attribute ref="my:RightsLevel"/>
     </xsd:complexType>
</xsd:element>

A Control contains following elements:

  1. Help: This element will be ignored. It only works in Grouping.

  2. CustomProperties: This element is not supported in FIM 2010.

  3. Options: This element is only used in combination with the UocDropDownList or UocRadioButtonList Controls. It is not functional with any other Controls. See the Options section in this document for the structure of this element. See the individual Control for how it is used in the context of a Control.

  4. Buttons: This element is only used in combination with the UocListView Control. It is not functional for any other controls. See UocListView section for more detail.

  5. Properties: This element is used in all Controls to specify additional behaviors of a Control. See the Properties section in this document for more details on this element.

  6. Events: See the Event section earlier in this document for the structure of this element. See the individual Control definition to determine which event is used in that control.

A Control contains the following attributes:

  1. Name: This is the Name of the control. The name of a Control must be unique within each panel. This is a required string type attribute.

  2. TypeName: This attribute specifies what type of Control it is. This is a required string type attribute. See the Individual Controls section in this document for each control name.

  3. Caption: This attribute allows you to include a caption for the control. The caption is usually the display name of the data that the control is displaying or inputting. You can explicitly specify a value for the caption or bind it with schema attribute display name information. The caption appears on the left hand side of a normal sized control. If a control is spanning full screen, the caption appears on top of the control. This is an optional string type attribute. See the Properties section for how to bind a data source with an attribute or a property value.

    Sample: The following example shows how a caption can be used explicitly.

    <my:Control my:Name="ExplicitAlias" my:TypeName="UocTextBox" my:Caption="Explicit Alias">…<my:Control/>

    The following example show how a caption can be used with a data source. If you have used the template for a data source shown earlier in this document, your data source is “schema”. It is recommended that you bind the attribute’s DisplayName with a Caption attribute.

    <my:Control my:Name="DynamicAlias" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=Alias.DisplayName, Mode=OneWay}">…<my:Control/>

  4. Enabled: This is an optional Boolean type attribute. By setting this attribute value to “false”, the user can disable a Control. The default value is set to “true”.

  5. Visible: This is a Boolean type optional attribute. You can use this attribute to hide the whole control. The default value is set to “true”.

  6. Description: Use this optional string type attribute to include a description to help the end user understand what they need to input in the control or what the control does. You can explicitly specify a value for the description or bind it with the schema attribute description information.

    The Description appears on the left hand side of a normal sized control underneath the caption. If a control is spanning full screen, the description appears on the top of the control underneath the caption. See the Properties section in this document for how to bind a data source with an attribute or a property value. Sample: This example shows how a Description can be used explicitly.

    <my:Control my:Name="ExplicitAlias" my:TypeName="UocTextBox" my:Caption="Explicit Alias" my:Description="This is explicit description.">…<my:Control/>

    This example shows how a Description can be used with a data source. If you have used the template for a data source shown earlier in this document, your data source is “schema”. It is recommended that you bind the attribute’s Description with a Description attribute.

    <my:Control my:Name="DynamicAlias" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=Alias.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=Alias.Description, Mode=OneWay}">…<my:Control/>

  7. ExpandArea : This attribute indicates if the control will span full screen. This is a Boolean type optional attribute. The default value is set to “false”.

    noteNote
    In this release of FIM 2010, the caption and description attributes are disabled when this is set to “true”. You must use the UocLabel control to provide a caption for an expanded control.

  8. Hint: This is an optional string type attribute. The text in the Hint attribute helps the end user to decide what is a valid input for the control. It appears underneath the control.

  9. AutoPostback: This is an optional Boolean type attribute. The default value is “false”. If set to “false”, a refresh of the page may not refresh the control. For more information about AutoPostback, look for the ASP.NET UI control property of the same name.

  10. RightsLevel: This is an optional string type attribute. You can only bind this with inline rights with a data source. The control is dynamically enabled or disabled based on the user’s rights. See the Properties section in this document for how to bind data source with an attribute or a property value. Sample: This example shows how a RightsLevel attribute can be used with a data source. If you have used the template for a data source shown earlier in this document, your data source is “rights”. Use the attribute name as the Path.

    <my:Control my:Name="DynamicAlias" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=Alias.DisplayName, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=Alias}">…<my:Control/>

Properties

You can use a Property to further customize the behavior of each control. A Property is an empty element. The following is the XSD schema for the Property element:

<xsd:element name="Properties">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Property" minOccurs="1" maxOccurs="32"/>
          </xsd:sequence>
     </xsd:complexType>
</xsd:element>
<xsd:element name="Property">
     <xsd:complexType>
          <xsd:simpleContent>
               <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Name"/>
                    <xsd:attribute ref="my:Value"/>
               </xsd:extension>
          </xsd:simpleContent>
     </xsd:complexType>
</xsd:element>

Every property has two required attributes:

  1. Name: This string type attribute is the unique name of the Property. Different controls have different properties. There are some common properties that can be used by all controls. See the Common Properties and Individual Control section for more details on what names are available for a given control.

  2. Value: This is the value of the Property. The data type of the value is depended on which property it is assigned to. See following section for the allowed value format for specific properties.

Some Properties can be bound with information from a data source. To do so, you need to use the following string format. See individual properties in the Individual Control section to see how to bind them with data source.

<my:Property my:Name="Required" my:Value="[Formatted String]"/>

Formatted String :=  “{Binding “ + [SourceExpression] + “,” + [PathExpression] + “,” + [ModeExpression]? + “}”

SourceExpression:= “Source=” + [ObjectDataSourceName]

PathExpression:= “Path=” + [AttributeName]|[AttributePropertyName]

ModeExpression:= “Mode=” + [ModeChoice]

ModeChoice:= “OneWay”|”TwoWay”

ObjectDataSourceName:= The value of any string assign to node /ObjectControlConfiguration/ObjectDataSource/Name.

AttributeName:= valid schema attribute name from the data source.

AttributePropertyName:= valid property name of a schema attribute from the data source.

For example:

<my:Property my:Name="Text" my:Value="{Binding Source=object, Path=DisplayName, Mode=TwoWay}"/>
<my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required}"/>

Common Properties

All RCDC controls specified in this document can have the following common properties. You can use these Properties along with other Properties specific to different controls.

  1. Required: This property indicates that the field is either a required field or an optional field. A required field must be filled with a value. An empty value is not supported in the case of string input. An optional field can be left empty. If it is a required field with no value filled in, an error message is displayed on top of the input control. You can explicitly specify if a field is required or optional. You can also bind it with schema information of a given binding between an attribute and a resource type. By default, if this property is missing, it means the control is an optional input control.

    Sample: This is an example that uses an explicit value for this property.

    <my:Property my:Name="Required" my:Value="True"/>

    This is an example that use dynamic data source for this property. If you have used the template for a data source shown in the previous section of this document, your data source is “schema”. Use the “<attribute name>.Required” as the Path.

    <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required}"/>

  2. ReadOnly: By setting this property to true, the end user experiences the control in a read only mode. This is an optional Boolean type attribute. The default value is set to false. However, sometimes the behavior of this property is overwritten by the type of rights one has on the data bind with the control. For example, if a user does not have rights to update a field and the field is bound with inline rights, he/she see the data in a read only mode even this property is set to false.

  3. RegularExpression: This Property specifies restrictions imposed on the value in the control. The formats of this property value are ones supported in the .NET StringRegex standard. (For more information, see http://go.microsoft.com/fwlink/?LinkId=165361). If the control is used to input value, the value will be checked against the restriction specified in this property when the user tries to leave the current page. The error message will be shown on top of the control that has invalid input. The user can explicitly specify a string regular expression. The user can also bind it with schema information of a given attribute. By default, if this property is missing, it means the control does not check for any restrictions on input strings.

    Sample: This is an example that uses an explicit value for this property.

    <my:Property my:Name="RegularExpression" my:Value="[A-Z]*"/>

    This is an example that uses dynamic data source for this property. If you have used the template for a data source shown previously in this document, your data source is “schema”. Use the “<attribute name>.StringRegex” as the Path.

    <my:Property my:Name="RegularExpression" my:Value="{Binding Source=schema, Path=Alias.StringRegex, Mode=OneWay}"/>

Options

The Options element includes one or more Option sub nodes. The Options element is only used with the UocRadioButtonList and UocDropDownList controls. See the individual control section for details on how to use them. The following is the XSD schema for the Options element:

<xsd:element name="Options">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Option" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
     </xsd:complexType>
</xsd:element>
<xsd:element name="Option">
     <xsd:complexType>
          <xsd:simpleContent>
               <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Value"/>
                    <xsd:attribute ref="my:Caption"/>
                    <xsd:attribute ref="my:Hint"/>
               </xsd:extension>
          </xsd:simpleContent>
     </xsd:complexType>
</xsd:element>

Attributes:

  1. Value: This is a required attribute of string type. The value attribute must be unique within the same control. Only regular A-Z case insensitive characters can be used.

  2. Caption: This required attribute is the display name of each Option.

  3. Hint: This is an optional attribute. Use this attribute to provide more information and hints to the end user.

Environment variables

The following environment variables can be used in any RCDC configuration:

 

%LoginID%

Displays the current logged in user’s ID

%LoginDomain%

Displays the current logged in user’s domain

%Today%

Displays the current date and time

%FromToday_nnn%

Displays the current date plus nnn and time. nnn is an integer.

%ObjectID%

The RCDC primary resource ID

%Attribute_xxx%

Returns a specified attribute, xxx, of the RCDC primary resource

Debugging XML Configuration Files

When developing or modifying XML configuration files for an RCDC, it can be much less error prone to validate the XML against XSD files using an editor such as Visual Studio. For more information, see http://msdn.microsoft.com/en-us/library/aa302298.aspx

Customizing a Help File

If you create new resources and attributes in FIM 2010, you may wish to update the existing Help files in the FIM Portal with content for your customized resources. Help files in the FIM Portal are in .htm format and can be edited manually.

ImportantImportant
For more information about creating custom attributes see Introduction to Schema Management in the FIM 2010 documentation set.

ImportantImportant
This section does not discuss the basics of formatting or editing HTML. To modify Help files in FIM 2010, you should already be familiar with editing HTML.

Location of the Help files – All the help files for the FIM Portal are located in the following folder on the FIM 2010 server:

%ProgramFiles%\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Layouts\MSILM2\Help\1033\html

How to locate the appropriate Help file – All the help files for the FIM Portal are named with a GUID. To locate the correct file for your custom resource:

  1. In the FIM Portal, open the Help file on the Portal page that you wish to customize.

  2. Right click the Help file and click Properties

  3. Highlight and copy the <GUID>.htm in the URL Address field.

  4. Navigate to the folder where the Help files are stored and search for the file.

Adding content for a new attribute – To add descriptive content for a new attribute within an existing Grouping element (Tab):

  1. Identify and locate the appropriate help file.

  2. Using an HTML editor, open the file.

  3. Locate where you want to add the content. Typically this will be an additional paragraph, for example:



    <p xmlns="">A new paragraph with customized information.</p>



    or an item inserted into an existing list, for example:



    <li class="unordered"><b>First Name</b> – The first name of the User.<br>

    <li class="unordered"><b>Last Name</b> - The last name of the User.<br>

    <li class="unordered"><b>Added a new line</b><br>

Adding content for a new Grouping element – The majority of FIM Portal pages have multiple Grouping elements (or Tabs), and the accompanying Help files have bookmarked sections that relate to each Grouping element. The bookmarks in the HTML are specified in the sections. For example, this the HTML for the Work Info tab from the Help file for the Create User page in the FIM Portal:

<a name="bkmk_grouping_WorkInfo" xmlns=""></a><h3 class="subHeading" xmlns="">Work Info</h3><p class="subHeading" xmlns=""></p><div class="subSection" xmlns="">

It is referenced by the Grouping element WorkInfo in the Configuration Data XML file for the Configuration for User Creation RCDC. Note that the GUID.htm filename and the bookmark are specified in the my:Link parameter:

<my:Grouping my:Name="WorkInfo" my:Caption="%SYMBOL_WorkInfoTabCaption_END%" my:Enabled="true" my:Visible="true"> <my:Help my:HelpText="%SYMBOL_WorkInfoTabHelpText_END%" my:Link="5e18a08b-4b20-48b8-90c6-c20f6cbeeb44.htm#bkmk_grouping_WorkInfo"/>

Simple Control Samples

The following figure shows a sample of different simple text box controls in different modes.

Example:

80527dde-d786-4ed1-9758-03b9c61b2eb1

The following code segment creates the first text box control, which uses explicit text for all attributes and properties.

<!-- Sample for a simple control to use explicit information. (with hints)-->
<my:Control my:Name="ExplicitControl" my:TypeName="UocTextBox" my:Caption="Explicit Control" my:Description="This is explicit description." my:Hint="This is a Hint (enter any text).">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="True"/>
          <my:Property my:Name="RegularExpression" my:Value="[A-Z]*"/>
          <my:Property my:Name="Text" my:Value="Enter Information Here"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple control to use explicit information.-->

The following code segment creates the second text box control, which uses dynamic binding technique to link the control with a different data source.

<!-- Sample for a simple control to use stored data information.-->
<my:Control my:Name="DynamicControl" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=DisplayName.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=DisplayName.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=DisplayName, Mode=OneWay}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required, Mode=OneWay}"/>
          <my:Property my:Name="RegularExpression" my:Value="{Binding Source=schema, Path=DisplayName.StringRegex, Mode=OneWay}"/>
          <my:Property my:Name="Text" my:Value="{Binding Source=object, Path=DisplayName, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple control to use stored data information.-->

The following code segment creates the third expanded label and text box control.

<!-- Sample for a simple expanded control with caption control.-->
<my:Control my:Name="SampleExpandLabel" my:TypeName="UocLabel" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="This is an expanded control."/>
     </my:Properties>
</my:Control>
<my:Control my:Name="ExpandedControl" my:TypeName="UocTextBox"
          my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="false"/>
          <my:Property my:Name="Columns" my:Value="40"/>
          <my:Property my:Name="Text" my:Value="Expanded control (enter text)"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple expanded control.-->

The following code segment creates the fourth disabled text box control. Although this control doesn’t have visible difference between disabled and enabled state, the user can no longer enter data in the text box.

<!-- Sample for a simple disabled control.-->
<my:Control my:Name="DisabledControl" my:TypeName="UocTextBox" my:Caption="Disabled Control" my:Description="This is disabled simple control." my:Enabled="false">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="false"/>
          <my:Property my:Name="MaxLength" my:Value="128"/>
          <my:Property my:Name="Text" my:Value="Disabled control"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple disabled control.-->

Individual Controls

UocButton

Name: UocButton

Description: This is a simple button control that you can use to trigger certain actions. However, since you cannot specify your own handler in this release of FIM 2010, the use of this control is limited.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. Text: This property specifies the text that is displayed on the button. This is an optional string type attribute. The text takes an explicit string value.

Event:

  • OnButtonClicked: The event is emitted when the button is clicked.

Sample:

Example:

74d41f3b-f75a-4084-8c04-1635fbf28a08

This is the xml segment that produces the simple button.

<!--Sample enabled simple button control-->
<my:Control my:Name="ButtonControl" my:TypeName="UocButton" my:Caption="SampleButton" my:Description="This is a simple button."
my:Hint="Click the button">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="True"/>
          <my:Property my:Name="Text" my:Value="Click Me"/>
     </my:Properties>
</my:Control>
<!--End of sample enabled simple button control -->

UocCaptionControl

Name: UocCaptionControl

Description: This control is used to display the caption of an RCDC page. This control is designed to be used only as a single control in a header grouping. Using it in any other context may cause rendering issues and/or portal errors.

Mode: Read only (OneWay)

Properties:

  1. All Common Properties: See the Common Properties section of this document for more detail.

  2. MaxHeight: This property specifies the maximum height the icon in the caption section can be. This property is optional. This property takes an integer value in pixels. The default value is 32 pixels.

Example:

59e9e4a7-1249-416e-a24f-0f254f5d2fef

This is the code segment that generates the “Header Caption”.

<!--Sample header caption control-->
<my:Control my:Name="SampleHeaderCaption" my:TypeName="UocCaptionControl" my:ExpandArea="true" my:Caption="Header Caption" my:Description="Description Starts here.">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="32"/>
          <my:Property my:Name="MaxWidth" my:Value="32"/>
     </my:Properties>
</my:Control>
<!--End of sample header caption control-->

This is the code segment that generates the “Explicit Content Caption”

<my:Control my:Name="SampleContentCaption" my:TypeName="UocCaptionControl" my:ExpandArea="true" my:Caption="Sample Explicit Content Caption" my:Description="Explicit content caption with smaller icon">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="20"/>
          <my:Property my:Name="MaxWidth" my:Value="20"/>
     </my:Properties>
</my:Control>
<!--End of sample caption-->

This is the code segment that generates the “Display Name” dynamic caption.

<!--Sample content dynamic caption-->
<my:Control my:Name="Caption3" my:TypeName="UocCaptionControl" my:Caption="{Binding Source=schema, Path=DisplayName.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=DisplayName.Description, Mode=OneWay}"/>
<!--End of sample caption -->

UocCheckBox

Name:UocCheckBox

Description: This is a simple check box control. It is recommended that the user binds this control with Boolean type data. This control can be used as a read only control or an updatable control based on the data it binds to.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. DefaultValue: This is an optional Boolean type property. The default value is set to false. This field specifies the default behavior of a check box. This can be specified explicitly.

  3. Checked: This is an optional Boolean type property. The default value is set to false. This value overwrites the DefaultValue property when it is present along with DefaultValue. This field specifies the behavior of a check box. Like DefaultValue, this can be specified explicitly or bound with data from the server.

  4. Text: This is an optional string type attribute. The text is shown on the right side of the check box. You can use this property to specify text that provides more information to the end user.

Events:

  • CheckedChanged: When the check box changes its state, this event is emitted.

Sample: In the following sample, a custom binding is created between the custom resource type and the attribute “IsConfigurationType”. The xml is used in the RCDC of a custom resource type.

Example:

906eaf71-03e5-49e6-80e0-e2960baa798e

The following is the code segment that produces a dynamic check box as shown as “Dynamic Check Box” in the above figure. This type of binding is generally more versatile and useful than an explicit checkbox. The attribute has to belong to the current resource type.

<!--Sample dynamic check box-->
<my:Control my:Name="SampleDynamicCheckBox" my:TypeName="UocCheckBox" my:Caption="Dynamic Check Box" my:Description="This is a dynamic check box. It saves to data source." my:RightsLevel="{Binding Source=rights, Path=IsConfigurationType}">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="{Binding Source=schema, Path=IsConfigurationType.DisplayName, Mode=OneWay}"/>
          <my:Property my:Name="Checked" my:Value="{Binding Source=object, Path=IsConfigurationType, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of sample dynamic check box -->

UocCommonMultiValueControl

Description: This is a multiline text box control that supports special string formatting. Each value among the multi-valued entries is separated from each other by a “;” or a line break in the text box. This control is recommended to bind with data of multi-valued short string and integer types. This control supports both read-only mode and updatable mode. Properties:

  1. All Common Properties: See the Common Properties section of this document for more detail.

  2. DataType: This is a required string type attribute. You can specify this as “String”, “Integer” or “DateTime” type explicitly. You can also bind this with the schema attribute’s DataType property. A Multivalued Reference type should be handled by UOCListView or UOCIdentityPicker. Multivalued Boolean is not a supported data type.

  3. Rows: This is an optional integer type attribute. You can define the height of the box in unit of characters. The default value is set to 1.

  4. Columns: This is an optional integer type attribute. You can define how many characters wide the box is. The default value is set to 20.

  5. Value: This is an optional string type attribute. You can only bind this with data source.

Events:

  • ValueListChanged: This event is triggered when the current value in the control is changed.

In the following example, a multi valued string attribute named “AMultiValueString” is created and bound to the custom resource type. This example only works once this binding is created.

Example:

ab9536ca-4cf4-4eeb-bd18-a89afac24b76

The following is the code segment that generates the above figure.

<!--Sample multi value control-->
<my:Control my:Name="SampleDynamicMultiValueControl" my:TypeName="UocCommonMultiValueControl" my:Caption="{Binding Source=schema, Path=AMultiValueString.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=AMultiValueString.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=AMultiValueString}">
     <my:Properties>
          <my:Property my:Name="Rows" my:Value="6"/>
          <my:Property my:Name="Columns" my:Value="60"/>
          <my:Property my:Name="DataType" my:Value="String"/>
          <!--not supported for above property my:Value={Binding Source=schema, Path=AMultiValueString.DataType, Mode=OneWay}"/>-->
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=AMultiValueString, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of sample multi value control -->

UocDateTimeControl

Name: UocDateTimeControl

Description: This is similar to a text box control, but it only accepts a certain format. In a read-only mode, it appears like a label. See the DateTimeFormat property in this section for the format of the input string supported. Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. DateTimeFormat: This is an optional string type attribute. The supported formats are “DateTime” or “DateOnly”. The default value is set to “DateTime” format.

    1. DateTime format: This is formatted as “mm/dd/yyyy hh:mm:ss AM”.

    2. DateOnly format: This is formatted as “mm/dd/yyyy”.

      noteNote
      In this release of FIM 2010, both DateTime and DateOnly format are supported regardless of the user specifying the difference.

  3. Value: This is an optional string type attribute. You bind this with a resource data source. The value has to conform to the correct date time format.

Events:

  • DateTimeChanged: When the data time value changes, the event is fired.

Example:

b3b49212-7671-4c0c-88b6-9bc2fd27f06f

The following is the code segment that produces the first date time control.

<!--Sample explicit date time control-->
<my:Control my:Name="SampleExplicitDateTimeControl" my:TypeName="UocDateTimeControl" my:Caption="Explicit Date Time Control" my:Description="The data shown here is explicit and in date time format.">
     <my:Properties>
          <my:Property my:Name="DateTimeFormat" my:Value="DateTime"/>
          <my:Property my:Name="Value" my:Value="11/11/2008 00:00:00"/>
     </my:Properties>
</my:Control>
<!--End of sample explicit date time control -->

The following is the code segment that produces the second date time control. If you have used the sample code provided in the Data Sources section, the ExpirationTime attribute is bound to all resource types, and thus can be used with following code.

<!--Sample dynamic date time control-->
<my:Control my:Name="SampleDynamicDateTimeControl" my:TypeName="UocDateTimeControl" my:Caption="{Binding Source=schema, Path=ExpirationTime.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=ExpirationTime.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=ExpirationTime}">
     <my:Properties>
          <my:Property my:Name="DateTimeFormat" my:Value="DateOnly"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ExpirationTime, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of dynamic explicit date time control -->

UocDropDownList

Name: UocDropDownList

Description: This is a simple drop down box control. This control is usually used when you want to select options from a defined set of choices. Data types of string, integer, datetime and Boolean are good candidates for this control.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more detail.

  2. ValuePath: The property to get the Value attribute from ItemSource. When ItemSource is specified as “Custom”, the value path is set to “Value”. It binds with the Value field from the Option element that is defined later in this document.

  3. CaptionPath: The property to get Value attribute from ItemSource. When ItemSource is specified as “Custom”, the value path is set to “Caption”. It binds with the Caption field from the Option element that is defined later in this document.

  4. HintPath: The property to get Value attribute from ItemSource. When ItemSource is specified as “Custom”, the value path is set to “Hint”. It binds with the Hint field from the Option element that is defined later in this document.

  5. ItemSource: A collection of ListControlItem which defines the choices in the list. The user can explicitly set this to “Custom” and use the Option element to specify the string value.

  6. SelectedValue: The value that is currently selected. This is a required string type property. This property is bound with string data from the data source.

Events:

  • SelectedIndexChanged: The event is fired when the selection in the drop down box is changed.

Options:

For structure of an Option element see the Option section in this document.

  1. Value: The Value of a single Option element can be set to any string that is the valid input of the data source that the control binds to.

  2. Caption: Can be any string value.

  3. Hint: Can be any string value.

Example:

444c1dec-3eea-42d1-930a-f95067716c1e
noteNote
In order to make the sample work, you must bind an existing string type attribute “Scope” with the custom resource type that the RCDC applies to.

This is the code segment that generates the drop down list.

<!--Sample for Drop Down List control-->
<my:Control my:Name="Scope" my:TypeName="UocDropDownList" my:Caption="{Binding Source=schema, Path=Scope.DisplayName}" my:RightsLevel="{Binding Source=rights, Path=Scope}">
     <my:Options>
          <my:Option my:Value="DomainLocal" my:Caption="Domain Local" my:Hint="to secure a local resource (i.e. a file share on your computer)" />
          <my:Option my:Value="Global" my:Caption="Global" my:Hint="to secure resources across your team or division" />
          <my:Option my:Value="Universal" my:Caption="Universal" my:Hint="to use this group across your organization" />
     </my:Options>
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=Scope.Required" />
          <my:Property my:Name="ValuePath" my:Value="Value" />
          <my:Property my:Name="CaptionPath" my:Value="Caption" />
          <my:Property my:Name="HintPath" my:Value="Hint" />
          <my:Property my:Name="ItemSource" my:Value="Custom" />
          <my:Property my:Name="SelectedValue" my:Value="{Binding Source=object, Path=Scope, Mode=TwoWay}" />
     </my:Properties>
</my:Control>
<!--End of Sample for Drop Down List control-->

UocFileDownload

Name: UocFileDownload

Description: This control contains a hyperlink. When the hyperlink is clicked, a Windows Save File window is shown. The user can save the file to their local drive. The “Open” option is also supported if the Internet Explorer (IE) can render the file format. The recommended data types to use this control with are formatted string (xml) and binary types.

noteNote
In this release of FIM 2010, the user has to close the IE window in which they have opened the file, and then refresh the page. After refreshing the IE window, they then can trigger the download in order to save or open the same file again in the original window.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. Text: This is an optional string type attribute that defines the hyperlink text. The user can specify an explicit string for this property.

  3. Value: This is a required attribute. It specifies the attribute binding on the server, whose content is to be downloaded.

  4. PromptedFileName: This is an optional string type attribute. It is the file name that is suggested to the user when they save the downloaded file.

  5. ContentType: This is a required string type attribute. This is the file type that the data is saved in. “Text” or “binary” are the two supported string options. If it is “text”, the return value would be considered as a long string; otherwise, “binary”, the return value would be considered as byte[]. If “text” is selected the user can optionally add a suffix to specify the type of format the text is in. For example, “text/xml” is valid.

noteNote
When the value bound to this control is empty, the control is missing the hyperlink to be used to trigger download action. This is because there is nothing to download.

Events:

There are no events for this control.

Example:

ed8959e6-cac8-4356-9596-d15be2adf7bf
noteNote
Before uploading this sample file, the user needs to create a binding between a custom resource type and the existing ConfigurationData attribute.

The following is the code segment that generates the file download control in the figure above.

<!--Sample dynamic download control-->
<my:Control my:Name="SampleDynamicFileDownloadControl" my:TypeName="UocFileDownload" my:Caption="{Binding Source=schema, Path=ConfigurationData.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=ConfigurationData.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=ConfigurationData}">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="Download Dummy xml"/>
          <my:Property my:Name="PromptedFileName" my:Value="DummyXML.xml"/>
          <my:Property my:Name="ContentType" my:Value="text/xml"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ConfigurationData}"/>
     </my:Properties>
</my:Control>
<!--End of dynamic download control -->

UocFileUpload

Name: UocFileUpload

Description: This control contains a text box that displays the location of the local file to be uploaded, a browse file button, and an upload button. When the browse button is clicked, a Windows Open File window is shown. The end user can select one file on their local drive to upload. When the file is selected, the file’s location is shown in the text box. Upon clicking the upload button, the file is uploaded to the client side local data source. The file content is not yet submitted to the server. The recommended data types to use this control with are: formatted string (xml) or binary types.

noteNote
In this release of FIM 2010, there is no indication of the upload progress or status. Once the file is uploaded to the local data source, the text box is cleared.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. Value: This is a required attribute. It specifies the schema attribute binding on the server, to which the data is uploaded.

  3. ContentType: This is an optional string type attribute. This is the data type that the file is saved to on the server. This can be set to “Text” or “Binary”. When the property is missing, the default value is “Binary

  4. MaxFileSize: This is an optional string type attribute. It defines how big the uploaded file size can be. By default, if the property is missing, it is 1 Megabyte.

  5. PromptedForNoValue: This is an optional string type attribute. It defines the text shown to user when there is not a file being uploaded.

Events:

  • FileUploaded: This event is emitted when the file is successfully uploaded.

Example:

37d284fb-a904-4aa8-916e-95083ceabb19
noteNote
In order to make following sample code work, you need to create a new Binary type attribute named “ABinaryAttribute”, and create a new binding between a custom resource type and this attribute.

The following is the code segment that generates the upload control seen in the above figure.

<!--Sample dynamic upload control-->
<my:Control my:Name="SampleDynamicFileUploadControl" my:TypeName="UocFileUpload" my:Caption="{Binding Source=schema, Path=ABinaryAttribute.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, my:RightsLevel="{Binding Source=rights, Path=ABinaryAttribute}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ABinaryAttribute.Required}"/>
          <my:Property my:Name="ContentType" my:Value="Binary"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ABinaryAttribute, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of dynamic upload control -->

UocFilterBuilder

Name:UocFilterBuilder

Description: This is a complex control that allows user to render an FIM 2010 Xpath expression. Some FIM 2010 Xpath expressions are not supported. For more details on the filter builder see the help document on how to use the filter builder.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. PermittedObjectTypes: This defines a list of resource types to be shown in the select statement of a filter builder. See the filter builder help document for more detail on how to use the filter builder. The String is in the format of “ResourceTypeA, ResourceTypeB”, where each resource type is separated by a “,” .

  3. Value: This is the value that filter builder is rendered with. In this release of FIM 2010, only a binding with a string type data that contains an xpath expression is supported. The Filter attribute is a recommended attribute to bind this control with.

  4. PreviewButtonVisible: This is an optional Boolean type property. When this is set to false, the user will not see a preview button. The default value is set to true. This button can be used in combination with a list view control to preview the results of an xpath expression. <ToDo>Need to test this.</ToDo>

  5. ExcludeGroupMembership: This is a Boolean property. When this is set to true, one cannot create a filter that uses “<Reference Attribute> (for example, ResourceID) is member of <Group object>”. In other words, when this is set to true, you cannot create a filter that uses the group membership directory.

  6. PreviewButtonCaption: This is an optional string. When PreviewButtonVisible is set to true, you can use this property to give the button a customized text. The text will show up on the preview button.

Events:

  • OnFilterChanged: This is triggered when the filter builder content is changed.

Example:

5462c718-2f66-4437-9765-23b2eca74dee
noteNote
Before using this sample code, you will need to create a new binding between an existing Filter attribute and a custom resource type.

The following is the sample code that includes a UOCLabel control, a simple filter builder with PermittedObjectTypes, and a Preview list view. You need to point the list view ListFilter property and filter builder Value property to the same data source attribute in order to link the two.

<!--Sample filter builder with preview list-->
<my:Control my:Name="ComplexFilterBuilderLabel" my:TypeName="UocLabel" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="This is a Filter Builder with preview."/>
     </my:Properties>
</my:Control>
<my:Control my:Name="ComplexFilterBuilder" my:TypeName="UocFilterBuilder" my:RightsLevel="{Binding Source=rights, Path=Filter}" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="PermittedObjectTypes" my:Value="Person,Group" />
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=Filter, Mode=TwoWay}" />
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=Filter.Required, Mode=OneWay}" />
     </my:Properties>
</my:Control>
<my:Control my:Name="FilterBuilder with preview" my:TypeName="UocListView" my:Caption="Preview Members" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="ColumnsToDisplay" my:Value="DisplayName,ObjectType,AccountName" />
          <my:Property my:Name="EmptyResultText" my:Value="There is no members according to the filter definition." />
          <my:Property my:Name="PageSize" my:Value="10" />
          <my:Property my:Name="ShowTitleBar" my:Value="false" />
          <my:Property my:Name="ShowActionBar" my:Value="false" />
          <my:Property my:Name="ShowPreview" my:Value="false" />
          <my:Property my:Name="ShowSearchControl" my:Value="false" />
          <my:Property my:Name="EnableSelection" my:Value="false" />
          <my:Property my:Name="SingleSelection" my:Value="false" />
          <my:Property my:Name="ItemClickBehavior" my:Value="ClientPopup" />
          <my:Property my:Name="ListFilter" my:Value="{Binding Source=object, Path=Filter}" />
     </my:Properties>
</my:Control>
<!--end of sample filter builder with preview-->

UocHtmlSummary

Name: UocHtmlSummary

Description: This control allows you to define a summary page in an RCDC page. This summary page shows after the end user submits a request. This control can only be used in a Summary Grouping, and must be the only control. You are strongly recommended to use the sample code provided.

noteNote
This control has not been extensively tested in this release of FIM 2010.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. ModificationsXml: This property must be formatted as {Binding Source=delta, Path=DeltaXml}, where “delta” is defined in the configuration header ObjectDataSource.

  3. TransformXsl: This property is usually formatted as {Binding Source=summaryTransformXsl, Path=/}, where “summaryTransformXsl” is defined in the configuration header XmlDataSource.

See Summary Grouping in the Grouping section earlier in this document for an existing sample of this control.

UocHyperLink

Name:UocHyperLink

Description: This is a simple hyperlink control. You use this control to display information as a hyperlink.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. ObjectReference: This is an optional reference type property. If a valid resource is referenced by the GUID defined in this property, the hyperlink provides the end user a way to access the resource. This is mutually exclusive with the NavigateUrl property (see below).

  3. Text: This is an optional string type property. You use this property to define the text that appears as the hyperlink.

  4. NavigateUrl: This is an optional string type property. You use this property to define the full path URL that the hyperlink links to. This is mutually exclusive with ObjectReference property (see above).

Example:

7cf6cf13-cef3-4fad-a3e2-bff1be2dbde1
noteNote
You have to have a valid GUID of a resource on hand to link this to. In this case, the second hyperlink is generated with a valid GUID. The first one can be any Web site.

The following is the code segment to generate a redirecting hyperlink.

<!--Sample for a hyperlink that redirects page.-->
<my:Control my:Name="RedirectHyperlink" my:TypeName="UocHyperLink" my:Caption="Redirect Hyperlink" my:Description="This is a hyperlink that takes you to other pages.">
     <my:Properties>
          <my:Property my:Name="NavigateUrl" my:Value="http://www.microsoft.com"/>
          <my:Property my:Name="Text" my:Value="Microsoft Home Page"/>
     </my:Properties>
</my:Control>
<!--End of Sample for a hyperlink that redirect page-->

The following is the code segment that generates a hyperlink that references a resource. The explicit reference can be replaced by the expression “{Binding Source=object, Path=Creator}” to bind this with a data source. This can only be valid when the resource’s manager exists and is of reference type value.

<!--Sample for a hyperlink that reference object-->
<my:Control my:Name="ReferenceHyperlink" my:TypeName="UocHyperLink" my:Caption="Reference Hyperlink" my:Description="This is a hyperlink gives you a object view of the reference object">
     <my:Properties>
          <my:Property my:Name="ObjectReference" my:Value="e4e048b1-9e43-415e-806c-cf44c429c34c"/>
          <my:Property my:Name="Text" my:Value="View a group in FIM 2010."/>
     </my:Properties>
</my:Control>
<!--End of Sample for a hyperlink that reference object-->

UocIdentityPicker

Name: UocIdentityPicker

Description: This control consists of an optional resolve box and a browse window. The optional resolve box consists of an optional text box to enter the identity, a resolve button to resolve the identity, and a browse button to prompt a pop up browse window. The browse window allows user to select identities through a list view control. The selected identity from the browse window is reflected in the resolve box.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. UsageKeywords: This is an optional string property. You can define a list of search scopes to be used in the resource picker by providing a list of the usage keywords supported by the SearchScopeConfiguration structure, where each keyword is separated by a “,”.

  3. Filter: This is an optional string property. The user provides an xpath expression to scope the resource picker to display only the items that fit within a defined scope. This property is mutually exclusive with the UsageKeywords property (see above). When the search scope is applied, this has no effect.

  4. ResultObjectType: This is an optional string property. The resource type is used to render resources in the popup dialog list. This is used with the Filter to help the Identity Picker identify what resource type will be returned by the Filter, and render the data accordingly. This property is mutually exclusive with the UsageKeywords property (see above). When the search scope is applied, this has no effect. The string accepted for this property is any single valid resource type name, for example, “Person”. When the filter is expected to return multiple resource types, “Resource” is used.

  5. PreviewTitle: This is the preview title used on a list view. See the UocListView section for more detail.

  6. ListViewTitle: This is an optional string property. You can use this property to define the text shown on top of the list view as a title.

  7. Value: This is an optional string property. It is recommended that you bind this with a schema attribute to connect the value with a data source.

  8. Mode: This is an optional string property. You use this property to define whether one value can be selected by the identity picker or multiple identities can be selected. “SingleResult” and “MultipleResult” are the allowed values. By default, it is set to “SingleResult”.

  9. ObjectTypes: This is an optional string property. You can define a list of resource types that the end user can resolve entries against in the Identity Picker resolve box. The list consists of a list of resource type names separated by a “,”.

  10. AttributesToSearch: This is an optional string property. You can define a list of attributes to be used to resolve the item in the identity picker, where the list is a list of schema attributes separated by a“,”. For example, if AttributesToSearch is set to “DisplayName, Alias”, it means that user will be able to search the items with DisplayName = <search value> or Alias=<search value>. It is recommended that the attribute names entered here are valid attributes on target resource types of the data source sited in Value. The target resource types can be found in the ObjectTypes field. All of the attributes need to be valid on any given resource types cited in the ObjectTypes field.

  11. ColumnsToDisplay: This is an optional string property. The user provides a list of schema attribute names separated by a “,”. The attributes defined here make up the column of the list view in the identity picker.

  12. Rows: This is an optional integer property. It only works when the Mode is set to “MultipleResult”. Use this property to set the height of the resolve text box to a given size in character units.

  13. MainSearchScreenText: This is an optional string property. This is the customized text that shows up while the search is running in the browse window.

Events:

  • SelectedObjectChanged: This is emitted when the user changes the selected resources.

Example:

2a0d88a8-4e67-4027-a367-50f885adc3c5
noteNote
In order for this sample to work, you will need to create a new binding between the Manager attribute and any custom resource type that this xml applies to.

The following is the code segment that generates an identity picker in single mode using the Filter and ResultObjectType properties as part of the RCDC:

<!--Sample for a single selection Identity Picker uses Filter and Result Object Type-->
<my:Control my:Name="SingleSelectionIdentityPicker" my:TypeName="UocIdentityPicker" my:Caption="A Single Selection Identity Picker" my:Description="The user only allowed to select one entry here." my:RightsLevel="{Binding Source=rights, Path=Manager}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=Manager.Required}"/>
          <my:Property my:Name="Mode" my:Value="SingleResult" />
          <!--Columns displayed in list view in pop up window-->
          <my:Property my:Name="ColumnsToDisplay" my:Value="DisplayName, ObjectType" />
          <!--Identities will be resolved against following attribute in the resolve textbox when resolve button is clicked.-->
          <my:Property my:Name="AttributesToSearch" my:Value="DisplayName, AccountName" />
          <!--single valued reference type attribute is used to bind the control-->
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=Manager , Mode=TwoWay}" />
          <!--Scoping the list explicitly to All Persons name contains letter "e"-->
          <my:Property my:Name="Filter" my:Value="/Person[contains(JobTitle, 'Manager')]"/>
          <!--Result object type specify the type is Person-->
          <my:Property my:Name="ResultObjectType" my:Value="Person"/>
          <my:Property my:Name="ListViewTitle" my:Value="Select only one entry" />
          <my:Property my:Name="PreviewTitle" my:Value="Entry selected:" />
     </my:Properties>
</my:Control>
<!--End of sample for a single selection Identity Picker.-->

Example:

ed07a86f-e685-4c33-9722-4747ae179835
noteNote
In order to make this sample code work, you will need to bind the ExplicitMember attribute (a multivalued reference attribute) to the custom resource type. You must also create search scopes with the UsageKeyword property set to “Person” and “Group”.

The following code segment creates the control seen in the above figure:

<!--Sample for a multi selection Identity Picker uses Search Scope-->
<my:Control my:Name="multiSelectionIdentityPicker" my:TypeName="UocIdentityPicker" my:Caption="A multi Selection Identity Picker" my:Description="The user only allowed to select one entry here." my:RightsLevel="{Binding Source=rights, Path=ExplicitMember}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ExplicitMember.Required}"/>
          <my:Property my:Name="Mode" my:Value="MultipleResult" />
          <my:Property my:Name="Rows" my:Value="10" />
          <!--There are existing search scopes that has key word "Person" and "Group" use both sets of search scopes here.-->
          <my:Property my:Name="UsageKeywords" my:Value="Person,Group"/>
          <!--Columns displayed in list view in pop up window-->
          <my:Property my:Name="ColumnsToDisplay" my:Value="DisplayName, ObjectType" />
          <!--Identities will be resolved against following attribute in the resolve textbox when resolve button is clicked.-->
          <my:Property my:Name="AttributesToSearch" my:Value="DisplayName, AccountName" />
          <!--multi valued reference type attribute is used to bind the control-->
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ExplicitMember , Mode=TwoWay}" />
          <my:Property my:Name="ResultObjectType" my:Value="Resource"/>
          <my:Property my:Name="ListViewTitle" my:Value="Select multiple entries" />
          <my:Property my:Name="PreviewTitle" my:Value="Entries selected" />
     </my:Properties>
</my:Control>
<!--End of sample for a multi selection Identity Picker.-->

UocLabel

Name: UocLabel

Description: This is a simple read-only text label control. It is recommended that this control is used to display read-only data.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. Text: This is a string type attribute. You define this property by providing an explicit string value or by binding it with a data source. A sample binding that assigns the Value of this property is {Binding Source=object, Path=<valid attribute name>

Sample: For a sample of the UocLabel control, see simple control in the Simple Control Samples section.

UocListView

Name: UocListView

Description: This is an advanced list view control. It consists of a simple list view, an optional simple search, an optional advanced search control, an optional selection preview box, and an action button bar. The optional simple search consists of a search scope and a simple search text box. The advanced search control is a filter builder. The list view shows a pre-rendered list of resources. It can also show search results coming from the search controls in this control. The action button bar defines what action can be taken based on the selection in the list view. The selection preview box shows what items are selected from the list view.

ImportantImportant
UocListView will not work with single-valued reference attributes. It can only be used with multi-valued reference attributes. For single-valued reference attributes, see UocIdentityPicker in this document.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. SelectedValue: This is an optional string type property that is usually bound to a multi-valued reference attribute, accepting a list of GUID formatted strings.

  3. PageSize: This is an optional integer property. The user can specify how many entries will fit in one page in a list view control. The default value is 10 entries. Any positive integer is valid.

  4. UsageKeyword: This is an optional string property. The user can specify a list of keywords that define what search scope is used in the list view search control. There are search scope resources in FIM 2010 server. The attribute on a SearchScopeConfiguration structure, called UsageKeyword, is used to group a set of search scopes. The list view consumes that list of keywords. Each keyword is separated by a “,”.

  5. SearchControlAutoPostback: This is an optional Boolean property. Set this to true to perform auto postback when a search is triggered. By default this is set to false.

  6. EmptyResultText: This is an optional string property. By default, it is set to “No items”, but can be set this to any string value. This text is displayed when a search result is empty.

  7. ButtonHeight: This is an optional integer property. Set this to any positive integer value. This defines the height of buttons in the action bar in pixels. The default value is 32 pixels.

  8. ButtonWidth This is an optional integer property. Set this to any positive integer value. This defines the width of buttons in the action bar in pixels. The default value is 32 pixels.

  9. CaptionImageMaxHeight: This is an optional integer property. Set this to any positive integer. This defines an optional caption’s max icon height. The default value is 32 pixels.

  10. CaptionImageMaxWidth: This is an optional integer property. Set this to any positive integer. This defines an optional caption’s max icon width. The default value is 32 pixels.

  11. CaptionImageUrl: This is an optional string property. This property defines a URL that links to an image that displays as the caption image.

  12. PreviewTitle: This is an optional string property. You use this to define the text that appears on top of the selection preview box.

  13. EnableSelection: This is an optional Boolean property. You use this to define if a list view is in selection mode. If a list view is in selection mode, a column of check boxes appears on the left most column of the list view and a selection preview box appears on the bottom of the list view. The default value is set to true.

  14. SingleSelection: This is an optional Boolean property. If the selection mode is enabled for the list view, setting this value to true will limit the end user to selecting only one item from the list. By default, this is set to false. This means that by default, the end user can select multiple items from the list.

  15. RedirectUrl: This is an optional string property. Use this property to specify a page to redirect to when clicking a hyperlinked item in the list. This URL can contain placeholders that are replace with the actual value during runtime. The placeholders are:

    • {0} - objectType

    • {1} - objectID

    • {2} - displayName

  16. ShowTitleBar: This is a optional Boolean property. Use this property to specify whether the title bar should be visible. Default value is false

  17. ShowActionBar: This is an optional Boolean property. Use this property to specify whether the action bar area should be visible. Default value is true.

  18. ShowPreview: This is an optional Boolean property. Use this property to specify whether preview area should be visible. Default value is true.

  19. ShowSearchControl: This is an optional Boolean property. Use this property to specify whether the search control should be visible. Default value is true.

  20. ResultObjectType: this is an optional string property. Use this property to specify the expected object type of the search results. Its default value is Resource. If the search result contains multiple resource types, this value should be specified as Resource.

  21. ColumnsToDisplay: This is an optional property. Use this property to specify which attributes you want the listview to display as columns. Its default value is “DisplayName, ResourceType”. Each column is represented by the system name of an attribute. Each column is separated by a “,”. You don’t need to specify value for this property when the listview is used in selection mode. In selection mode, the columns setting comes from SearchScopeColumn attribute of the search scope that is currently selected.

  22. ListFilter: This is an optional string property. When this value is specified, the listview will use this property value for query and the listview is not in selection mode. The filter can either be bound to an string attribute of the resource:

    <my:Property my:Name="ListFilter" my:Value="{Binding Source=object, Path=Filter}"/>
    or be a string that contains some predefined environment variable:

    <my:Property my:Name="ListFilter" my:Value="/Approval[Request=''%ObjectID%'']"/>
    
    <add a pointer to the list of predefined environment variables>

  23. TargetAttribute: This is an obsolete property. Its value should be the system name of a multi-valued referenced attribute. It is not recommended to use this property any more. For example in group management, instead of

    <my:Property my:Name="TargetAttribute" my:Value="ExplicitMember"/>
    It should be:

    <my:Property my:Name=”ListFilter” my:Value=”/Group[ObjectID=’%ObjectID%’]/ExplicitMember”/>
    
  24. ItemClickBehavior: this is an optional string property. Use this property to specify whether you want the click a listview item to trigger a server postback or to pop up a detail view of the item. Two option values are supported: ClientPopup, Server. The default value is ClientPopup.

  25. SearchOnLoad: This is an optional Boolean property to specify whether the listview control should query on load. This property is only applicable when the listview is in selection mode. The default value for this property is true. You can turn it off if you expect user to usually type in some text to hit search, to get meaningful result. In that case the listview will initially show a message to educate the user to do a search. The text can be customized by below properties.

  26. MainSearchScreenText: This optional string property is only applicable when SearchOnload is set to true. It can be used to customize text displayed in the middle of the listview, when the listview does not automatically search. The default value is “Find the resources you want using the search above”. You can specify a value to make the text more related to your scenario.

  27. SubSearchScreenText: this optional string property is used to customize the text displayed below MainSearchScreenText. Usually you don’t need to specify a value for this property, unless you want to add some additional instruction on how to use the listview.

For examples of how to use list view along with the UocFilterBuilder control as a preview list, see the UocFilterBuilder samples earlier in this document. The UocListView can also be used without the filter builder.

UocNumericBox

Name: UocNumericBox

Description: This is a simple text box that takes only integer values. This control supports both read-only mode and updatable mode.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. MaxValue: This is an optional integer type property. Use this property to define a client side validation for the control. The value entered by the end user cannot exceed this value. You can enter an explicit integer or bind this with integer data from a data source by using “{Binding Source=schema Path=IntegerMaximum}”.

  3. MinValue: This is an optional integer type property. Use this property to define a client side validation for the control. The value entered by the end user cannot be lower than this value. You can enter an explicit integer or bind this with integer data from a data source by using “Binding Source=schema, Path=IntegerMinimum}”.

  4. DefaultValue: This is an optional integer type property. Use this property to define a default value for the control if the control is used to create new data. This value can only be explicitly set to a static integer.

  5. Value: This is an optional integer type property. When you bind this with a integer type data from a data source, the value of that attribute is displayed when the page is loaded, and then saved to the data source after submission.

Handler:

  • TextChanged: This event is emitted when the current value inside of the control is changed.

Example:

121e342f-8181-4774-b224-136861b25460
noteNote
This is the sample code to generate the first numeric box. The numeric box is not connected with a data source or any schema information.

<!--Sample for an explicit Numeric Box-->
<my:Control my:Name="SampleExplicitNumericBox" my:TypeName="UocNumericBox" my:Caption="An Explicit NumericBox" my:Description="This is a dummy numeric box that is not linked with data source.">
     <my:Properties>
          <my:Property my:Name="MinValue" my:Value="1"/>
          <my:Property my:Name="MaxValue" my:Value="100"/>
          <my:Property my:Name="DefaultValue" my:Value="1"/>
     </my:Properties>
</my:Control>
<!--End of sample for an explicit Numeric Box.-->

This is the sample code to generate the second numeric box.

noteNote
In order for this sample to work, you will first need to create a new integer type attribute called “AnIntegerAttribute” and bind it with the custom resource type.

<!--Sample for a dynamically rendered Numeric Box-->
<my:Control my:Name="SampleDynamicNumericBox" my:TypeName="UocNumericBox" my:Caption="{Binding Source=schema, Path=AnIntegerAttribute.DisplayName}" my:Description="{Binding Source=schema, Path=AnIntegerAttribute.Description}" my:RightsLevel="{Binding Source=rights, Path=AnIntegerAttribute}">
     <my:Properties>
          <my:Property my:Name="MaxValue" my:Value="{Binding Source=schema, Path=AnIntegerAttribute.IntegerMaximum}"/>
          <my:Property my:Name="MinValue" my:Value="{Binding Source=schema, Path=AnIntegerAttribute.IntegerMinimum}"/>
          <my:Property my:Name="DefaultValue" my:Value="1"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=AnIntegerAttribute, Mode=TwoWay}"/>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=AnIntegerAttribute.Required}"/>
     </my:Properties>
</my:Control>
<!--End of sample for a dynamically Numeric Box.-->

UocPictureBox

Name: UocPictureBox

Description: This control is used to render picture binary type data. This control is recommended to be used with binary type data. The picture can be rendered either by provided image URL, binary type data, or the attribute source that contains picture type data.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. ImageUrl: This is an optional string type property. Enter the URL of the target picture.

  3. MaxHeight: This is an optional string type property. It defines the maximum height of the image to be rendered in pixels.

  4. MaxWidth: This is an optional string type property. It defines the maximum width of the image to be rendered in pixels.

  5. ImageData: This is a binary type property. Use this to bind a data source with the displayed image. The bound data source has to be of binary. You can also use this field to explicitly set a picture by providing data in byte[] format.

  6. ImageResource: This is an optional binary type property. <ToDo>Is this duplicate with ImageData?< ToDo>

  7. AlternativeText: This is an optional string property. This displays as alternative text when the picture cannot be displayed.

Sample:

noteNote
To use this sample, you must have an existing image data bind with the control.

The following code segment will generate a picture box control that binds a data source with the control.

<!--Sample for a Picture Box control binding with a data source-->
<my:Control my:Name="SamplePictureBoxImageData" my:TypeName="UocPictureBox" my:RightsLevel="{Binding Source=rights, Path=Photo}">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="100" />
          <my:Property my:Name="MaxWidth" my:Value="100" />
          <my:Property my:Name="ImageData" my:Value="{Binding Source=object, Path=Photo}" />
     </my:Properties>
</my:Control>
<!--End of Sample for a Picture Box control-->

The following code segment will generate a picture box control that binds a URL image with the control.

<!--Sample for a Picture Box control bind with explicit URL-->
<my:Control my:Name="SamplePictureBoxImageUrl" my:TypeName="UocPictureBox">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="100" />
          <my:Property my:Name="MaxWidth" my:Value="100" />
          <my:Property my:Name="ImageUrl" my:Value="http://www.microsoft.com/dummypicture.jpg" />
     </my:Properties>
</my:Control>
<!--End of Sample for a Picture Box control-->

UocRadioButtonList

Name: UocRadioButtonList

Description: This is a simple radio button list. The choices are mutually exclusive in this list. This control is recommended when users have five or less options to choose from. Otherwise, UOCListView is recommended

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. ValuePath: The value path is set to “Value”. It binds with the Value field from the Option element that is defined in this document.

  3. CaptionPath: The value path is set to “Caption”. It binds with the Caption field from the Option element that is defined in this document.

  4. HintPath : The value path is set to “Hint”. It binds with the Hint field from the Option element that is defined in this document.

  5. SelectedValue: The value that is currently selected. This is a required string type property. This property binds with string data from the data source.

Events:

  1. SelectedIndexChanged

  2. CheckedChanged

Options:

There can only be two Option elements in Options for this control.

  1. Value: The Value field in a single Option element has to be set to either “True” or “False”.

  2. Caption: This can be any string value.

  3. Hint: This can be any string value.

Example:

eb0945bc-83ff-4d51-8810-1c89ff20400b
noteNote
For this sample to work, you will need to create a new Boolean attribute, “ABooleanAttribute”, and bind it with your custom resource type.

The following code segment creates the radio button list in the above figure:

<!--Sample for Radio Button List control-->
<my:Control my:Name="SampleRadioButtonList" my:TypeName="UocRadioButtonList" my:Caption="{Binding Source=schema, Path=ABooleanAttribute.DisplayName}" my:Description="{Binding Source=schema, Path=ABooleanAttribute.Description}" my:RightsLevel="{Binding Source=rights, Path=ABooleanAttribute}">
     <my:Options>
          <my:Option my:Value="False" my:Caption="Set Value To False" my:Hint="By selecting this option, you are setting the value of the attribute to false." />
          <my:Option my:Value="True" my:Caption="Set Value To True" my:Hint="By selecting this option, you are setting the value of the attribute to true." />
     </my:Options>
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ABooleanAttribute.Required}" />
          <my:Property my:Name="ValuePath" my:Value="Value" />
          <my:Property my:Name="CaptionPath" my:Value="Caption" />
          <my:Property my:Name="HintPath" my:Value="Hint" />
          <my:Property my:Name="SelectedValue" my:Value="{Binding Source=object, Path=ABooleanAttribute, Mode=TwoWay}" />
     </my:Properties>
</my:Control>
<!--End of Sample for Radio Button List control-->

UocSimpleRadioButton

Name: UocSimpleRadioButton

Description: This is a simple radio button control. The usage of this control is similar to a simple check box. There are two radio buttons showing side by side with text labeling. Binding the control to Boolean type data is recommended.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. TrueText: This is an optional string type property. This is the text that appears when the radio button is selected.

  3. FalseText: This is an optional string type property. This is the text that appears when the radio button is not selected.

  4. SelectedItem: This is an optional Boolean type property. This value indicates that the radio button is selected. This can bind with Boolean type data from a data source. The default value is set to false.

Events:

  • CheckedChanged: When the radio button changes state from selected to unselected or vice versa, this signal is emitted.

Example:

32519426-fabc-4e74-aa17-e7296546d695
noteNote
In order to make the sample work, you will need to create a new Boolean attribute “ABooleanAttribute” and bind it to your custom resource type. The RCDC data is applied to the same custom resource type.

The following is the code segment that generates the radio button in the above figure:

<!--Sample for simple radio button control-->
<my:Control my:Name="SampleSimpleRadioButton" my:TypeName="UocSimpleRadioButton" my:Caption="{Binding Source=schema, Path=ABooleanAttribute.DisplayName}" my:Description="{Binding Source=schema, Path=ABooleanAttribute.Description}" my:RightsLevel="{Binding Source=rights, Path=ABooleanAttribute}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ABooleanAttribute.Required}" />
          <my:Property my:Name="FalseText" my:Value="False"/>
          <my:Property my:Name="TrueText" my:Value="True"/>
          <my:Property my:Name="SelectedItem" my:Value="{Binding Source=object, Path=ABooleanAttribute, Mode=TwoWay}" />
     </my:Properties>
</my:Control>
<!--End of Sample for simple radio button control-->

UocTextBox

Name: UocTextBox

Description: This is a simple text box that supports string type input. It is recommended that you use this control to bind with string type data.

Properties:

  1. All Common Properties: See the Common Properties section of this document for more details.

  2. MaxLength: This is an optional integer attribute. This specifies the maximum length a string input can be. The default value for this is 128 chars long.

  3. Text: This is an optional string type property. This is the text appears in the text box. You can define an explicit string that displays in the text box during initial loading of the control, or bind it to a schema attribute of string type.

  4. Rows: This is an optional integer type property. This defines the height of the text box in char unit. The default value is 1 char.

  5. Columns: This is an optional integer type property. This defines the width of the text box in char unit. The default value is 20 chars.

  6. Wrap: This is an optional Boolean type property. By setting this to true, the user enables the word wrap feature in the text box. The default value is set to true.

Events:

  • TextChanged: This event is emitted when the text inside the text box is changed.

See the Simple Control section for a complete sample of this control.

Appendix A: Default XSD Schema

The following is the complete XSD schema for all default RCDCs provided with FIM 2010.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema targetNamespace="http://schemas.microsoft.com/2006/11/ResourceManagement" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/2006/11/ResourceManagement" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:attribute name="TypeName" type="my:requiredString"/>
      <xsd:attribute name="Name" type="my:requiredAlphanumericString"/>
      <xsd:attribute name="Parameters" type="xsd:string"/>
      <xsd:attribute name="DisplayAsWizard" type="xsd:boolean"/>
      <xsd:attribute name="Caption" type="xsd:string"/>
      <xsd:attribute name="AutoValidate" type="xsd:boolean"/>
      <xsd:attribute name="Enabled" type="xsd:string"/>
      <xsd:attribute name="Visible" type="xsd:string"/>
      <xsd:attribute name="IsSummary" type="xsd:boolean"/>
      <xsd:attribute name="IsHeader" type="xsd:boolean"/>
      <xsd:attribute name="HelpText" type="xsd:string"/>
      <xsd:attribute name="Link" type="xsd:string"/>
      <xsd:attribute name="Description" type="xsd:string"/>
      <xsd:attribute name="ExpandArea" type="xsd:boolean"/>
      <xsd:attribute name="Hint" type="xsd:string"/>
      <xsd:attribute name="AutoPostback" type="xsd:string"/>
      <xsd:attribute name="RightsLevel" type="my:requiredString"/>
      <xsd:attribute name="Value" type="xsd:string"/>
      <xsd:attribute name="Handler" type="my:requiredString"/>
      <xsd:attribute name="ImageUrl" type="xsd:string"/>
      <xsd:attribute name="RedirectUrl" type="xsd:string"/>
      <xsd:attribute name="ClickBehavior" type="xsd:string"/>
      <xsd:attribute name="EnableMode" type="xsd:string"/>
      <xsd:attribute name="ValueType" type="xsd:string"/>
      <xsd:element name="ObjectControlConfiguration">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="my:ObjectDataSource" minOccurs="0" maxOccurs="32"/>
                        <xsd:element ref="my:XmlDataSource" minOccurs="0" maxOccurs="32"/>
                        <xsd:element ref="my:Panel"/>
                        <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
                  </xsd:sequence>
                  <xsd:attribute ref="my:TypeName"/>
                  <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="ObjectDataSource">
            <xsd:complexType>
                  <xsd:sequence/>
                  <xsd:attribute ref="my:TypeName"/>
                  <xsd:attribute ref="my:Name"/>
                  <xsd:attribute ref="my:Parameters"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="XmlDataSource">
            <xsd:complexType  mixed="true">
      <xsd:sequence>
        <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
      </xsd:sequence>
      <xsd:attribute ref="my:Name"/>
      <xsd:attribute ref="my:Parameters"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Panel">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="my:Grouping" minOccurs="1" maxOccurs="16"/>
                  </xsd:sequence>
                  <xsd:attribute ref="my:Name"/>
                  <xsd:attribute ref="my:DisplayAsWizard"/>
                  <xsd:attribute ref="my:Caption"/>
                  <xsd:attribute ref="my:AutoValidate"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Grouping">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
                        <xsd:element ref="my:Control" minOccurs="1" maxOccurs="256"/>
                        <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
                  </xsd:sequence>
                  <xsd:attribute ref="my:Name"/>
                  <xsd:attribute ref="my:Caption"/>
                  <xsd:attribute ref="my:Description"/>
                  <xsd:attribute ref="my:Enabled"/>
                  <xsd:attribute ref="my:Visible"/>
                  <xsd:attribute ref="my:IsHeader"/>
                  <xsd:attribute ref="my:IsSummary"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Help">
            <xsd:complexType>
                  <xsd:sequence/>
                  <xsd:attribute ref="my:HelpText"/>
                  <xsd:attribute ref="my:Link"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Control">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
                        <xsd:element ref="my:CustomProperties" minOccurs="0"  maxOccurs="1"/>
                        <xsd:element ref="my:Options" minOccurs="0"  maxOccurs="1"/>
                        <xsd:element ref="my:Buttons" minOccurs="0"  maxOccurs="1"/>
                        <xsd:element ref="my:Properties" minOccurs="0"  maxOccurs="1"/>
                        <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
                  </xsd:sequence>
                  <xsd:attribute ref="my:Name"/>
                  <xsd:attribute ref="my:TypeName"/>
                  <xsd:attribute ref="my:Caption"/>
                  <xsd:attribute ref="my:Enabled"/>
                  <xsd:attribute ref="my:Visible"/>
                  <xsd:attribute ref="my:Description"/>
                  <xsd:attribute ref="my:ExpandArea"/>
                  <xsd:attribute ref="my:Hint"/>
                  <xsd:attribute ref="my:AutoPostback"/>
                  <xsd:attribute ref="my:RightsLevel"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="CustomProperties">
            <xsd:complexType mixed="true">
                  <xsd:sequence>
                        <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##targetNamespace" processContents="lax"/>
                  </xsd:sequence>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Options">
            <xsd:complexType>
                  <xsd:sequence>
                  <xsd:element ref="my:Option" minOccurs="0" maxOccurs="unbounded"/>
                  </xsd:sequence>
                  <xsd:attribute ref="my:ValueType"/>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Option">
            <xsd:complexType>
                  <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                              <xsd:attribute ref="my:Value"/>
                              <xsd:attribute ref="my:Caption"/>
                              <xsd:attribute ref="my:Hint"/>
                        </xsd:extension>
                  </xsd:simpleContent>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Buttons">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="my:Button" minOccurs="1" maxOccurs="8"/>
                  </xsd:sequence>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Button">
            <xsd:complexType>
                  <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                              <xsd:attribute ref="my:Name"/>
                              <xsd:attribute ref="my:Caption"/>
                              <xsd:attribute ref="my:Hint"/>
                              <xsd:attribute ref="my:ImageUrl"/>
                              <xsd:attribute ref="my:ClickBehavior"/>
                              <xsd:attribute ref="my:RedirectUrl"/>
                              <xsd:attribute ref="my:Enabled"/>
                              <xsd:attribute ref="my:Visible"/>
                              <xsd:attribute ref="my:EnableMode"/>
                        </xsd:extension>
                  </xsd:simpleContent>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Properties">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="my:Property" minOccurs="1" maxOccurs="32"/>
                  </xsd:sequence>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Property">
            <xsd:complexType>
                  <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                              <xsd:attribute ref="my:Name"/>
                              <xsd:attribute ref="my:Value"/>
                        </xsd:extension>
                  </xsd:simpleContent>
            </xsd:complexType>
      </xsd:element>
      <xsd:element name="Events">
            <xsd:complexType>
                  <xsd:sequence>
                        <xsd:element ref="my:Event" minOccurs="1" maxOccurs="16"/>
                  </xsd:sequence>
            </xsd:complexType>
   </xsd:element>
   <xsd:element name="Event">
            <xsd:complexType>
                  <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                              <xsd:attribute ref="my:Name"/>
                              <xsd:attribute ref="my:Handler"/>
                        </xsd:extension>
                  </xsd:simpleContent>
            </xsd:complexType>
   </xsd:element>
   <xsd:simpleType name="requiredString">
            <xsd:restriction base="xsd:string">
                  <xsd:minLength value="1"/>
            </xsd:restriction>
   </xsd:simpleType>
  <xsd:simpleType name="requiredAlphanumericString">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[A-Za-z0-9_]{1,128}"/>
    </xsd:restriction>
  </xsd:simpleType>
   <xsd:simpleType name="requiredAnyURI">
            <xsd:restriction base="xsd:anyURI">
                  <xsd:minLength value="1"/>
            </xsd:restriction>
   </xsd:simpleType>
   <xsd:simpleType name="requiredBase64Binary">
            <xsd:restriction base="xsd:base64Binary">
                  <xsd:minLength value="1"/>
            </xsd:restriction>
      </xsd:simpleType>
</xsd:schema>

Appendix B: Default Summary XSL

The following is the complete Summary XSL provided with FIM 2010.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  <xsl:template name="output-attribute-value">
    <xsl:param name="attribute"/>
    <xsl:param name="type"/>
    <xsl:choose>
      <xsl:when test="$type='Binary'">
        <xsl:value-of select="$attribute" disable-output-escaping="yes"/>
      </xsl:when>
      <xsl:when test="$type='Text'">
        <xsl:text xml:space="preserve" disable-output-escaping="yes">(text data)</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="translate($attribute,' ','&#160;')" disable-output-escaping="yes"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="output-modified-value">
    <xsl:param name="name"/>
    <xsl:param name="attribute1"/>
    <xsl:param name="text1"/>
    <xsl:param name="attribute2"/>
    <xsl:param name="text2"/>
    <xsl:param name="type"/>
    <tr class="listViewRow" style="height:22px;">
      <xsl:if test="position() mod 2 != 0">
        <td class="commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$name" disable-output-escaping="yes"/>
        </td>
        <xsl:choose>
          <xsl:when test="$attribute1 and $attribute1!=''">
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute1"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text1"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:choose>
          <xsl:when test="$attribute2 and $attribute2!=''">
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute2"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text2"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:if>
      <xsl:if test="position() mod 2 != 1">
        <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$name" disable-output-escaping="yes"/>
        </td>
        <xsl:choose>
          <xsl:when test="$attribute1 and $attribute1!=''">
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute1"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text1"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:choose>
          <xsl:when test="$attribute2 and $attribute2!=''">
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute2"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text2"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:if>
    </tr>
  </xsl:template>

  <xsl:template name="output-localized-attribute-value">
    <xsl:param name="locale"/>
    <xsl:param name="attribute"/>
    <xsl:param name="type"/>
    <tr class="listViewRow" style="height:22px;">
      <xsl:if test="position() mod 2 != 0">
        <td class="commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$locale" disable-output-escaping="yes"/>
        </td>
        <td class="commonSummaryListViewCellBR ms-vb">
          <xsl:call-template name="output-attribute-value">
            <xsl:with-param name="attribute" select="$attribute"/>
            <xsl:with-param name="type" select="$type"/>
          </xsl:call-template>
        </td>
      </xsl:if>
      <xsl:if test="position() mod 2 != 1">
        <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$locale" disable-output-escaping="yes"/>
        </td>
        <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
          <xsl:call-template name="output-attribute-value">
            <xsl:with-param name="attribute" select="$attribute"/>
            <xsl:with-param name="type" select="$type"/>
          </xsl:call-template>
        </td>
      </xsl:if>
    </tr>
  </xsl:template>

  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="ModifiedAttributes[@ActionType='Create']">
        <!-- expected XML
        <ModifiedAttributes ActionType="Create">
          <Attribute Name="[attribute's system name]" DisplayName="[attribute's display name]" DataType="[all kinds of ILM data type]" InitializedValue="[the value]"/>
          other <Attribute> elements
        </ModifiedAttributes>
        -->
        <table cellspacing="0" cellpadding="3" class="commonSummaryListViewGridBorder">
          <tr align="left" class="listViewHeader" style="height:22px;">
            <th class="commonSummaryListViewHeaderCellBR">Attribute</th>
            <th class="commonSummaryListViewHeaderCellBR">Value</th>
          </tr>
          <xsl:for-each select="ModifiedAttributes/Attribute">
            <xsl:sort select="@DisplayName" order="ascending"/>
            <tr class="listViewRow" style="height:22px;">
              <xsl:if test="position() mod 2 != 0">
                <td class="commonSummaryListViewCellBR ms-vb">
                  <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                </td>
                <xsl:if test="count(LocalizedValue)!=0">
                  <td class="commonSummaryListViewCellBR ms-vb">
                    <table cellspacing="0" style="width:100%">
                      <tr class="listViewHeader">
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Language</th>
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Status</th>
                      </tr>
                      <xsl:if test="@InitializedValue and @InitializedValue != ''">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="@DataType"/>
                        </xsl:call-template>
                      </xsl:if>
                      <xsl:for-each select="LocalizedValue">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="../@DataType"/>
                        </xsl:call-template>
                      </xsl:for-each>
                    </table>
                  </td>
                </xsl:if>
                <xsl:if test="count(LocalizedValue)=0">
                  <td class="commonSummaryListViewCellBR ms-vb">
                    <xsl:call-template name="output-attribute-value">
                      <xsl:with-param name="attribute" select="@InitializedValue"/>
                      <xsl:with-param name="type" select="@DataType"/>
                    </xsl:call-template>
                  </td>
                </xsl:if>
              </xsl:if>
              <xsl:if test="position() mod 2 != 1">
                <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                  <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                </td>
                <xsl:if test="count(LocalizedValue)!=0">
                  <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                    <table cellspacing="0" style="width:100%">
                      <tr class="listViewHeader">
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Language</th>
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Status</th>
                      </tr>
                      <xsl:if test="@InitializedValue and @InitializedValue != ''">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="@DataType"/>
                        </xsl:call-template>
                      </xsl:if>
                      <xsl:for-each select="LocalizedValue">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="../@DataType"/>
                        </xsl:call-template>
                      </xsl:for-each>
                    </table>
                  </td>
                </xsl:if>
                <xsl:if test="count(LocalizedValue)=0">
                  <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                    <xsl:call-template name="output-attribute-value">
                      <xsl:with-param name="attribute" select="@InitializedValue"/>
                      <xsl:with-param name="type" select="@DataType"/>
                    </xsl:call-template>
                  </td>
                </xsl:if>
              </xsl:if>
            </tr>
          </xsl:for-each>
        </table>
      </xsl:when>
      <xsl:when test="ModifiedAttributes[@ActionType='Modify']">
        <!-- expected XML
        <ModifiedAttributes ActionType="Modify">
          <SingleAttribute Name="[attribute's system name]" DisplayName="[attribute's display name]" DataType="[all kinds of ILM data type]" InitializedValue="[the old value]" SetValue="[the new value]"/>
          other <SingleAttribute> elements
          <MultipleAttribute Name="[attribute's system name]" DisplayName="[attribute's display name]" DataType="[all kinds of ILM data type]" InsertedItem="[inserted items separated by ';']" RemovedItem="[removed items separated by ';']"/>
          other <MultipleAttribute> elements
        </ModifiedAttributes>
        -->
        <table class="commonSummaryListViewGridBorder" cellspacing="0" cellpadding="3">
          <xsl:if test="ModifiedAttributes[count(SingleAttribute)!=0]">
            <tr align="left" class="listViewHeader">
              <th class="commonSummaryListViewHeaderCellBR">Single-Value Attributes</th>
              <th class="commonSummaryListViewHeaderCellBR">Old Value</th>
              <th class="commonSummaryListViewHeaderCellBR">New Value</th>
            </tr>
            <xsl:for-each select="ModifiedAttributes/SingleAttribute">
              <xsl:sort select="@DisplayName" order="ascending"/>
              <xsl:if test="count(LocalizedValue)!=0">
                <tr class="listViewRow">
                  <xsl:if test="position() mod 2 != 0">
                    <td class="commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td colSpan="2">
                      <table cellspacing="0" cellpadding="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Old Value</th>
                          <th class="commonSummaryListViewHeaderCellBR">New Value</th>
                        </tr>
                        <xsl:if test="(@InitializedValue and @InitializedValue !='') or (@SetValue and @SetValue != '')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="../@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                  <xsl:if test="position() mod 2 != 1">
                    <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td colSpan="2">
                      <table cellspacing="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Old Value</th>
                          <th class="commonSummaryListViewHeaderCellBR">New Value</th>
                        </tr>
                        <xsl:if test="(@InitializedValue and @InitializedValue !='') or (@SetValue and @SetValue != '')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="../@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                </tr>
              </xsl:if>
              <xsl:if test="count(LocalizedValue)=0">
                <xsl:call-template name="output-modified-value">
                  <xsl:with-param name="name" select="@DisplayName"/>
                  <xsl:with-param name="attribute1" select="@InitializedValue"/>
                  <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                  <xsl:with-param name="attribute2" select="@SetValue"/>
                  <xsl:with-param name="text2">(value removed)</xsl:with-param>
                  <xsl:with-param name="type" select="@DataType"/>
                </xsl:call-template>
              </xsl:if>
            </xsl:for-each>
          </xsl:if>
          <xsl:if test="ModifiedAttributes[count(MultipleAttribute)!=0]">
            <tr align="left" class="listViewHeader">
              <th class="commonSummaryListViewHeaderCellBR">Multiple-Value Attributes</th>
              <th class="commonSummaryListViewHeaderCellBR">Removed Items</th>
              <th class="commonSummaryListViewHeaderCellBR">Inserted Items</th>
            </tr>
            <xsl:for-each select="ModifiedAttributes/MultipleAttribute">
              <xsl:sort select="@DisplayName" order="ascending"/>
              <xsl:if test="count(LocalizedValue)!=0">
                <tr class="uocSummaryTitleTR">
                  <xsl:if test="position() mod 2 != 0">
                    <td class="commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td>
                      <table cellspacing="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Removed Items</th>
                          <th class="commonSummaryListViewHeaderCellBR">Inserted Items</th>
                        </tr>
                        <xsl:if test="(@RemovedItem and @RemovedItem!='') or (@InsertedItem and @InsertedItem!='')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                  <xsl:if test="position() mod 2 != 1">
                    <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td>
                      <table cellspacing="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Removed Items</th>
                          <th class="commonSummaryListViewHeaderCellBR">Inserted Items</th>
                        </tr>
                        <xsl:if test="(@RemovedItem and @RemovedItem!='') or (@InsertedItem and @InsertedItem!='')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                </tr>
              </xsl:if>
              <xsl:if test="count(LocalizedValue)=0">
                <xsl:call-template name="output-modified-value">
                  <xsl:with-param name="name" select="@DisplayName"/>
                  <xsl:with-param name="attribute1" select="@RemovedItem"/>
                  <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                  <xsl:with-param name="attribute2" select="@InsertedItem"/>
                  <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                  <xsl:with-param name="type" select="@DataType"/>
                </xsl:call-template>
              </xsl:if>
            </xsl:for-each>
          </xsl:if>
        </table>
      </xsl:when>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Page view tracker