<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://ofbiz.apache.org/Widget-Form" targetNamespace="http://ofbiz.apache.org/Widget-Form">
    <xs:include schemaLocation="http://ofbiz.apache.org/dtds/widget-common.xsd" />

  <!-- ================== FORMS ==================== -->
    <xs:element name="forms">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element ref="form"/>
                <xs:element ref="grid"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="form">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="actions" />
                <xs:element minOccurs="0" ref="row-actions" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="alt-row-style" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="alt-target" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="auto-fields-service" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="auto-fields-entity" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="field" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="on-event-update-area" />
                <xs:element minOccurs="0" ref="sort-order" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:attribute name="type">
                <xs:annotation>
                    <xs:documentation>The form type is always required unless you are extending another form.</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="single">
                            <xs:annotation>
                                <xs:documentation>a single form is a simple single form with values from a single set of values</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="list">
                            <xs:annotation>
                                <xs:documentation>DEPRECATED use grid instead - a list form is a list of individual forms in a table (could be called a tabular form), it has a list of sets of values and creates one form for each list element</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="multi">
                            <xs:annotation>
                                <xs:documentation>a multi form is like a list/tabular form, but it creates a single form to submit all list item forms at once; the field names in the resulting form have an appendage attached to make them unique according to the pattern used for the multi-service
                                    event handler that will call one service for each list element</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="upload">
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="target" type="xs:string" />
            <xs:attribute name="target-window" type="xs:string" />
            <xs:attribute name="target-type" default="intra-app">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="intra-app" />
                        <xs:enumeration value="inter-app" />
                        <xs:enumeration value="content" />
                        <xs:enumeration value="plain" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="id" type="xs:string" />
            <xs:attribute name="style" type="xs:string" />
            <xs:attribute name="focus-field-name" type="xs:string" />
            <xs:attribute name="title" type="xs:string" />
            <xs:attribute name="empty-form-data-message" type="xs:string" default="${uiLabelMap.CommonNoRecordFound}"/>
            <xs:attribute name="tooltip" type="xs:string" />
            <xs:attribute name="list-name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>for list type and other multiple data/form types this is the name of the list in the context to iterate over</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="list-entry-name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>if specified each list entry will be put in the context with this name; otherwise the list entry must be a Map and the entries in the Map will be put into the context by name</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <!-- this is now deprecated, never made sense to separate anyway; use list-name instead <xs:attribute type="xs:string" name="list-iterator-name"/> -->
            <xs:attribute type="xs:string" name="default-map-name" />
            <xs:attribute type="xs:string" name="default-entity-name" />
            <xs:attribute type="xs:string" name="default-service-name" />
            <xs:attribute type="xs:string" name="form-title-area-style">
                <xs:annotation>
                    <xs:documentation>The form-title-area-style specifies the style to use in the header or title area for the form in a multi-form widget with all form fields rendered in one area.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="form-widget-area-style">
                <xs:annotation>
                    <xs:documentation>The form-widget-area-style specifies the style to use in the main or widget area for the form in a multi-form widget with all form fields rendered in one area.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-title-area-style" />
            <xs:attribute type="xs:string" name="default-widget-area-style" />
            <xs:attribute type="xs:string" name="default-title-style" />
            <xs:attribute type="xs:string" name="default-widget-style" />
            <xs:attribute type="xs:string" name="default-tooltip-style" />
            <xs:attribute type="xs:string" name="default-required-field-style" />
            <xs:attribute type="xs:string" name="sort-field-parameter-name">
                <xs:annotation>
                    <xs:documentation>
                        The name of the request parameter that is used for specifying the sorted column. This is required when you
                        have more than one list on a screen - each list must use its own sort field parameter. Defaults to "sortField".
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-sort-field-style">
                <xs:annotation>
                    <xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-sort-field-asc-style">
                <xs:annotation>
                    <xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order-asc".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-sort-field-desc-style">
                <xs:annotation>
                    <xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order-desc".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate" default="${paginate}">
                <xs:annotation>
                    <xs:documentation>Indicate if this form is paginated or not, true by default.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-target">
                <xs:annotation>
                    <xs:documentation>Target location for the [Previous] and [Next] buttons in a form with pagination. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-target-anchor">
                <xs:annotation>
                    <xs:documentation>Target anchor for the [Previous] and [Next] buttons in a form with pagination.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-size-field">
                <xs:annotation>
                    <xs:documentation>The name of the parameter that specifies the number of rows to display for each page in a list form with multiple pages. The default is VIEW_SIZE. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-index-field">
                <xs:annotation>
                    <xs:documentation>The name of the parameter that specifies what the current page is in a list form with multiple pages. The default is VIEW_INDEX Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="override-list-size">
                <xs:annotation>
                    <xs:documentation>The total number of rows in the original list (used for pagination).
                                      If not specified, the size of the list will be used. Accepts ${} notation.
                                      You may use any value, true makes sense, when using performFindList, but one value must be passed.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-first-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [First] button in a form with pagination. Defaults to the CommonFirst label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-previous-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [Previous] button in a form with pagination. Defaults to the CommonPrevious label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-next-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [Next] button in a form with pagination. Defaults to the CommonNext label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-last-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [Last] button in a form with pagination. Defaults to the CommonLast label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-style">
                <xs:annotation>
                    <xs:documentation>CSS style to use for the whole pager in a form with pagination. Defaults to "nav-pager".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="item-index-separator" default="_o_" />
            <xs:attribute type="xs:string" name="extends" />
            <xs:attribute type="xs:string" name="extends-resource" />
            <xs:attribute name="separate-columns" type="xs:boolean"
                          default="false"/>
            <xs:attribute name="group-columns" type="xs:boolean" default="true"/>
            <xs:attribute type="xs:integer" name="view-size">
                <xs:annotation>
                    <xs:documentation>The number of items to display per page</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="row-count" />
            <xs:attribute name="use-row-submit" type="xs:boolean" default="false"/>
            <xs:attribute name="skip-start" type="xs:boolean" default="false"/>
            <xs:attribute name="skip-end" type="xs:boolean" default="false"/>
            <xs:attribute name="hide-header" type="xs:boolean" default="false"/>
            <xs:attribute type="xs:string" name="odd-row-style">
                <xs:annotation>
                    <xs:documentation>The odd-row-style specifies the style to use in the table content odd rows.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="even-row-style">
                <xs:annotation>
                    <xs:documentation>The even-row-style specifies the style to use in the table content even rows.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="header-row-style">
                <xs:annotation>
                    <xs:documentation>The header-row-style specifies the style to use in the header of table.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-table-style">
                <xs:annotation>
                    <xs:documentation>The default-table-style specifies the style to use in the table.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="client-autocomplete-fields"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>Tells the browser whether or not to try and autocomplete with values previously entered. Default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <!--
                not sure this is such a good idea <xs:attribute type="xs:string" name="hidden-values-map-name"> <xs:annotation> <xs:documentation>A map that contains hidden field name/value pairs. The reason for this is to eliminate the need to code custom forms so that auxiliary, passthru data can
                be sent to the server. By doing it this way, more standard forms can be used. </xs:documentation> </xs:annotation> </xs:attribute>
            -->
        </xs:complexType>
    </xs:element>
    <xs:element name="grid">
        <xs:annotation>
            <xs:documentation>
                a list of individual forms in a table (could be called a tabular form), it has a list of sets of values and creates one form for each list element
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="actions" />
                <xs:element minOccurs="0" ref="row-actions" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="alt-row-style" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="alt-target" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="auto-fields-service" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="auto-fields-entity" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="field" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="on-event-update-area" />
                <xs:element minOccurs="0" ref="sort-order" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:attribute name="target" type="xs:string" />
            <xs:attribute name="target-window" type="xs:string" />
            <xs:attribute name="target-type" default="intra-app">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="intra-app" />
                        <xs:enumeration value="inter-app" />
                        <xs:enumeration value="content" />
                        <xs:enumeration value="plain" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="id" type="xs:string" />
            <xs:attribute name="style" type="xs:string" />
            <xs:attribute name="focus-field-name" type="xs:string" />
            <xs:attribute name="title" type="xs:string" />
            <xs:attribute name="empty-form-data-message" type="xs:string" default="${uiLabelMap.CommonNoRecordFound}"/>
            <xs:attribute name="tooltip" type="xs:string" />
            <xs:attribute name="list-name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>for list type and other multiple data/form types this is the name of the list in the context to iterate over</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="list-entry-name" type="xs:string">
                <xs:annotation>
                    <xs:documentation>if specified each list entry will be put in the context with this name; otherwise the list entry must be a Map and the entries in the Map will be put into the context by name</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <!-- this is now deprecated, never made sense to separate anyway; use list-name instead <xs:attribute type="xs:string" name="list-iterator-name"/> -->
            <xs:attribute type="xs:string" name="default-map-name" />
            <xs:attribute type="xs:string" name="default-entity-name" />
            <xs:attribute type="xs:string" name="default-service-name" />
            <xs:attribute type="xs:string" name="form-title-area-style">
                <xs:annotation>
                    <xs:documentation>The form-title-area-style specifies the style to use in the header or title area for the form in a multi-form widget with all form fields rendered in one area.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="form-widget-area-style">
                <xs:annotation>
                    <xs:documentation>The form-widget-area-style specifies the style to use in the main or widget area for the form in a multi-form widget with all form fields rendered in one area.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-title-area-style" />
            <xs:attribute type="xs:string" name="default-widget-area-style" />
            <xs:attribute type="xs:string" name="default-title-style" />
            <xs:attribute type="xs:string" name="default-widget-style" />
            <xs:attribute type="xs:string" name="default-tooltip-style" />
            <xs:attribute type="xs:string" name="default-required-field-style" />
            <xs:attribute type="xs:string" name="sort-field-parameter-name">
                <xs:annotation>
                    <xs:documentation>
                        The name of the request parameter that is used for specifying the sorted column. This is required when you
                        have more than one list on a screen - each list must use its own sort field parameter. Defaults to "sortField".
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-sort-field-style">
                <xs:annotation>
                    <xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-sort-field-asc-style">
                <xs:annotation>
                    <xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order-asc".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-sort-field-desc-style">
                <xs:annotation>
                    <xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order-desc".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate" default="${paginate}">
                <xs:annotation>
                    <xs:documentation>Indicate if this form is paginated or not, true by default.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-target">
                <xs:annotation>
                    <xs:documentation>Target location for the [Previous] and [Next] buttons in a form with pagination. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-target-anchor">
                <xs:annotation>
                    <xs:documentation>Target anchor for the [Previous] and [Next] buttons in a form with pagination.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-size-field">
                <xs:annotation>
                    <xs:documentation>The name of the parameter that specifies the number of rows to display for each page in a list form with multiple pages. The default is VIEW_SIZE. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-index-field">
                <xs:annotation>
                    <xs:documentation>The name of the parameter that specifies what the current page is in a list form with multiple pages. The default is VIEW_INDEX Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="override-list-size">
                <xs:annotation>
                    <xs:documentation>The total number of rows in the original list (used for pagination). If not specified, the size of the list will be used. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-first-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [First] button in a form with pagination. Defaults to the CommonFirst label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-previous-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [Previous] button in a form with pagination. Defaults to the CommonPrevious label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-next-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [Next] button in a form with pagination. Defaults to the CommonNext label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-last-label">
                <xs:annotation>
                    <xs:documentation>Text to display for the [Last] button in a form with pagination. Defaults to the CommonLast label defined in CommonUiLabels.xml. Accepts ${} notation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="paginate-style">
                <xs:annotation>
                    <xs:documentation>CSS style to use for the whole pager in a form with pagination. Defaults to "nav-pager".</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="item-index-separator" default="_o_" />
            <xs:attribute type="xs:string" name="extends" />
            <xs:attribute type="xs:string" name="extends-resource" />
            <xs:attribute name="separate-columns" type="xs:boolean"
                          default="false"/>
            <xs:attribute name="group-columns" type="xs:boolean" default="true"/>
            <xs:attribute type="xs:integer" name="view-size">
                <xs:annotation>
                    <xs:documentation>The number of items to display per page</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="row-count" />
            <xs:attribute name="use-row-submit" type="xs:boolean" default="false"/>
            <xs:attribute name="skip-start" type="xs:boolean" default="false"/>
            <xs:attribute name="skip-end" type="xs:boolean" default="false"/>
            <xs:attribute name="hide-header" type="xs:boolean" default="false"/>
            <xs:attribute type="xs:string" name="odd-row-style">
                <xs:annotation>
                    <xs:documentation>The odd-row-style specifies the style to use in the table content odd rows.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="even-row-style">
                <xs:annotation>
                    <xs:documentation>The even-row-style specifies the style to use in the table content even rows.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="header-row-style">
                <xs:annotation>
                    <xs:documentation>The header-row-style specifies the style to use in the header of table.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-table-style">
                <xs:annotation>
                    <xs:documentation>The default-table-style specifies the style to use in the table.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="client-autocomplete-fields"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>Tells the browser whether or not to try and autocomplete with values previously entered. Default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <!--
                not sure this is such a good idea <xs:attribute type="xs:string" name="hidden-values-map-name"> <xs:annotation> <xs:documentation>A map that contains hidden field name/value pairs. The reason for this is to eliminate the need to code custom forms so that auxiliary, passthru data can
                be sent to the server. By doing it this way, more standard forms can be used. </xs:documentation> </xs:annotation> </xs:attribute>
            -->
        </xs:complexType>
    </xs:element>
    <xs:element name="alt-target">
        <xs:complexType>
            <xs:attribute name="use-when" type="xs:string" use="required" />
            <xs:attribute name="target" type="xs:string" />
            <xs:attribute name="target-type" type="xs:string" />
        </xs:complexType>
    </xs:element>
    <xs:element name="alt-row-style">
        <xs:annotation>
            <xs:documentation>Active a style on a line if the use-when condition is validate</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="use-when" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Boolean expression tested for active the style on a line.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="style" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>If use-when return true, concat this style to existing style of the line.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="auto-fields-service">
        <xs:complexType>
            <xs:attribute name="service-name" type="xs:string" use="required" />
            <xs:attribute name="map-name" type="xs:string" />
            <xs:attribute name="default-field-type" default="edit">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="edit" />
                        <xs:enumeration value="find" />
                        <xs:enumeration value="display" />
                        <xs:enumeration value="hidden" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="default-position" type="xs:positiveInteger" default="1" />
        </xs:complexType>
    </xs:element>
    <xs:element name="auto-fields-entity">
        <xs:complexType>
            <xs:attribute name="entity-name" type="xs:string" use="required" />
            <xs:attribute name="map-name" type="xs:string" />
            <xs:attribute name="default-field-type" default="edit">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="edit" />
                        <xs:enumeration value="find" />
                        <xs:enumeration value="display" />
                        <xs:enumeration value="hidden" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:positiveInteger" name="default-position" default="1" />
            <xs:attribute name="include-internal" type="xs:boolean" default="false">
                <xs:annotation>
                    <xs:documentation>This field will let the user enable internal fields of entity</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="sort-order">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="sort-field" />
                <xs:element ref="last-field" />
                <xs:element ref="field-group" />
                <xs:element ref="banner" />
            </xs:choice>
            <xs:attribute name="type" default="explicit">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="explicit" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="field-group">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="sort-field" />
            </xs:sequence>
            <xs:attribute type="xs:string" name="title">
                <xs:annotation>
                    <xs:documentation>A unique name for this fields group.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="collapsible">
                <xs:annotation>
                    <xs:documentation>Indicate in this fields group is collapsible or not, false by default.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="initially-collapsed">
                <xs:annotation>
                    <xs:documentation>Indicate in this fields group is initially collapsed or not, false by default. If set to true implies collapsible even if not set</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="id">
                <xs:annotation>
                    <xs:documentation>Set an unique CSS identifier to this fields group.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="style">
                <xs:annotation>
                    <xs:documentation>Set a CSS style to this fields group.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="banner">
        <xs:complexType>
            <xs:attribute type="xs:string" name="style" />
            <xs:attribute type="xs:string" name="text" />
            <xs:attribute type="xs:string" name="text-style" />
            <xs:attribute type="xs:string" name="left-text" />
            <xs:attribute type="xs:string" name="left-text-style" />
            <xs:attribute type="xs:string" name="right-text" />
            <xs:attribute type="xs:string" name="right-text-style" />
        </xs:complexType>
    </xs:element>
    <xs:element name="sort-field">
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:attribute name="position" type="xs:positiveInteger" />
        </xs:complexType>
    </xs:element>
    <xs:element name="last-field">
        <xs:annotation>
            <xs:documentation>last-field reorder the given field at the end form. This element is propagated to the inherited form</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required" />
        </xs:complexType>
    </xs:element>
    <!-- ================== Form Events ==================== -->
    <xs:element name="on-event-update-area">
        <xs:annotation>
            <xs:documentation>Area to be updated when a form event occurs.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="auto-parameters-service"/>
                <xs:element minOccurs="0" ref="auto-parameters-entity"/>
                <xs:element minOccurs="0" ref="auto-parameters-form"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter" />
            </xs:sequence>
            <xs:attribute name="event-type" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="paginate" />
                        <xs:enumeration value="sort-column" />
                        <xs:enumeration value="submit" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="area-id" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        Mandatory in classic usage.
                        This has been made optional for template needs (common-theme) and automatic area-id
                        definition, based on calling widget.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="area-target" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        Mandatory in classic usage.
                        This has been made optional for template needs (common-theme) and automatic area-id
                        definition, based on calling widget.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

  <!-- ================== FIELDS ==================== -->
    <xs:element name="AllFields" abstract="true"/>
    <xs:element name="field">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="AllFields" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="on-field-event-update-area" />
            </xs:sequence>
            <xs:attribute type="xs:string" name="name" use="required">
                <xs:annotation>
                    <xs:documentation>A unique name for this field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="map-name">
                <xs:annotation>
                    <xs:documentation>The name (or location) of the map that contains the data for this field in the form context.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="entity-name">
                <xs:annotation>
                    <xs:documentation>Used along with the field-name to look up the entity field definition for any information that might be helpful when rendering the form field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="field-name">
                <xs:annotation>
                    <xs:documentation>See the description of entity-name.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="service-name">
                <xs:annotation>
                    <xs:documentation>Used along with the attribute-name to look up the service attribute definition for any information that might be helpful when rendering the form field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="attribute-name">
                <xs:annotation>
                    <xs:documentation>See the description of service-name.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="entry-name">
                <xs:annotation>
                    <xs:documentation>Defaults to the value of the name attribute; is used to specify the name of the entry in the map that contains the value to populate.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="parameter-name">
                <xs:annotation>
                    <xs:documentation>Specifies the parameter name to use for this field - i.e. the name attribute of an
                        HTML input field in a web application.

                        Accepts Unified Expression Language (JSR 245) notation, i.e. ${}, to allow use of expressions.

                        Defaults to the value of the name attribute.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="title">
                <xs:annotation>
                    <xs:documentation>
                        The name of this field that will be shown to the user.
                        It can use the ${} and foo.bar (dot) syntax to insert values from the context for parameterization or internationalization.

                        Be sure a "FormFieldTitle_" labels does not already exist, else it will be overridden.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="header-link">
                <xs:annotation>
                    <xs:documentation>A link for this field in the header of a list form. Useful for sorting a list form by different columns.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="header-link-style">
                <xs:annotation>
                    <xs:documentation>The CSS style for a header-link.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="tooltip">
                <xs:annotation>
                    <xs:documentation>The text to show on mouse over or help for more information; can use the ${} and foo.bar (dot) syntax to insert values from the context for parameterization or internationalization.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="title-area-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the area around the title of this field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="widget-area-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the area around the widget that the user will interact with for this field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="title-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the title of this field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="widget-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the widget that the user will interact with for this field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="tooltip-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the tooltip of this field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:positiveInteger" name="position" default="1">
                <xs:annotation>
                    <xs:documentation>For row oriented forms (single type) can specify that the field should be put a column other than the first; for column oriented forms (list type) specifies the row the field should be put in.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="red-when" default="by-name">
                <xs:annotation>
                    <xs:documentation>The widget/interaction part will be red if the date value is before-now (for thruDate), after-now (for fromDate), or by-name (if the field's name or entry-name or fromDate or thruDate the corresponding action will be done); only applicable when the field is a
                        timestamp.</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="never" />
                        <xs:enumeration value="before-now" />
                        <xs:enumeration value="after-now" />
                        <xs:enumeration value="by-name" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="use-when" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        Used to specify a condition that must be true to use this field; the condition should be written using the
                        Java syntax and can operate on values in the form context; conditional fields are evaluated in reverse
                        order so the last field defined that evaluates to true is the one that is rendered.
            </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ignore-when" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        This attribute is defined to enable ignoring a field on a form of type list or multi,
                        which is not possible using use-when attribute. Like use-when it should be written using java syntax.
                        The condition should be evaluated in the form context without looking for data coming from list that feeds the form.
                        </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="encode-output" type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>
                        This is for textual output only. If true data shown in fields will be encoded so that it does not interfere with markup of the target output.
                        For example, if output is HTML then data presented will be HTML encoded so that all HTML-specific characters are escaped.
            </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="event">
                <xs:annotation>
                    <xs:documentation>Used to specify a javascript event that may be attached to field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="action">
                <xs:annotation>
                    <xs:documentation>Used to specify a javascript action that should be run based on an existing specified event.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="id-name">
                <xs:annotation>
                    <xs:documentation>Define the string to be used as the identifier (like a DOM id attribute) for this
                        field.

                        Accepts ${} notation to allow use of expressions.

                        If undefined then defaults to [form-name]_[name] where form-name is set using the form-name
                        attribute or taken from the containing form element's name attribute.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="separate-column" type="xs:boolean" default="false"/>
            <xs:attribute name="required-field" type="xs:boolean"/>
            <xs:attribute type="xs:string" name="required-field-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the title of this field if required.
                        Will default to form's default-required-field-style.
                        If field is required, but required-field-style is empty, an '*' will be placed to the right of text,
                        textarea and password fields.
                </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="sort-field" type="xs:boolean" default="false"/>
            <xs:attribute type="xs:string" name="sort-field-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the sort field link.
                        Will default to form's default-sort-field-style.
                </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="sort-field-help-text">
                <xs:annotation>
                    <xs:documentation>Help text to be displayed when the mouse hovers over the column heading.
                </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="sort-field-asc-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the sort field link ordered ascending.
                        Will default to form's default-sort-field-asc-style.
                </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="sort-field-desc-style">
                <xs:annotation>
                    <xs:documentation>The name of a style (like a CSS class) to apply to the sort field link ordered descending.
                        Will default to form's default-sort-field-desc-style.
                </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="form-name">
                <xs:annotation>
                    <xs:documentation>
                        The name of the parent form. This is needed for lookups of children forms.
                        The parent form being the first form with skip-end="true" which precedes the children forms (with skip-start="true").
                        Must be set also on the related field if description-field-name is used.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="tabindex">
                <xs:annotation>
                    <xs:documentation>
                        The HTML tabindex specifies the tab order of an element (when the "tab" button is used for navigating).
                        To exclude an element from the tab order, set the value of tabindex to 0
                        In that case the element is skipped when the user tabs around the form.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="condition-group">
                <xs:annotation>
                    <xs:documentation>
                        The condition-group regroup search criterias together.
                        Each group member will be gathered with AND operator
                        Every defined groups will be joined each other with OR operator
                        Any ungrouped condition will be added with AND operator
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="disabled">
                <xs:annotation>
                    <xs:documentation>
                        Set a field as disabled : not mutable, not focusable, not submitted if in a form.
                        Accepts ${} notation to allow use of expressions.
                        Expressions must evaluate to the strings 'true', 'false' (without quotes) or empty (equivalent to false)
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

  <!-- ================== FIELD TYPES ==================== -->
    <xs:element name="check" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="entity-options" />
                <xs:element ref="list-options" />
                <xs:element ref="option" />
            </xs:choice>
            <xs:attribute name="all-checked" type="xs:boolean">
                <xs:annotation>
                    <xs:documentation>
                        None option is checked by default.
                        You may check options by setting field names as in QuoteForms.xml#FindQuotes
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="container" substitutionGroup="AllFields">
        <xs:complexType />
    </xs:element>
    <xs:element name="date-find" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute name="type" default="timestamp">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="timestamp" />
                        <xs:enumeration value="date" />
                        <xs:enumeration value="time" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="default-option-from" default="equals">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="equals" />
                        <xs:enumeration value="sameDay" />
                        <xs:enumeration value="greaterThanFromDayStart" />
                        <xs:enumeration value="greaterThan" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="default-option-thru" default="lessThan">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="lessThan" />
                        <xs:enumeration value="upToDay" />
                        <xs:enumeration value="upThruDay" />
                        <xs:enumeration value="empty" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="date-time" substitutionGroup="AllFields">
        <xs:annotation>
            <xs:documentation>
                A special entry for date-time fields; may just have a default size text
                entry box and some sort of widget to make date entry/selection easier.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="type" default="timestamp">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="timestamp" />
                        <xs:enumeration value="date" />
                        <xs:enumeration value="time" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="input-method" default="text">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="text" />
                        <xs:enumeration value="time-dropdown" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="clock" default="24">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="12" />
                        <xs:enumeration value="24" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="step" default="1">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="1" />
                        <xs:enumeration value="5" />
                        <xs:enumeration value="10" />
                        <xs:enumeration value="15" />
                        <xs:enumeration value="30" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="mask" default="N">
                <xs:annotation>
                    <xs:documentation>Will use the type value if set to yes, add a masked input</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="Y" />
                        <xs:enumeration value="N" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="display" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="in-place-editor" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="also-hidden" type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>If set to true, an hidden form field is also rendered, with the name of the field and its content.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="description">
                <xs:annotation>
                    <xs:documentation>
                        Specifies the string to display, can use the ${} syntax to insert context values;
                        if empty the value of the field will be printed for a default.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:integer" name="size">
                <xs:annotation>
                    <xs:documentation>
                        Specifies the size of the field (as a number of characters),
                        when the text to display exceed the given size it is truncated and add the complete text as a hint
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="type" default="text">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="text" />
                        <xs:enumeration value="currency" />
                        <xs:enumeration value="date">
                            <xs:annotation>
                                <xs:documentation>Display only the date part of a timestamp field</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="date-time">
                            <xs:annotation>
                                <xs:documentation>Display only the date and hours:minutes part of a timestamp field</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="image">
                            <xs:annotation>
                                <xs:documentation>Display the image specified in image-location</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="accounting-number">
                            <xs:annotation>
                                <xs:documentation>Display negatives in parentheses (configurable, see arithmetic.properties)</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="number">
                            <xs:annotation>
                                <xs:documentation>Display as number with the format type given (configurable, see arithmetic.properties)</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="currency">
                <xs:annotation>
                    <xs:documentation>Specifies the currency uom ID used to format context value, should generally use the ${} syntax to retrieve value.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="image-location">
                <xs:annotation>
                    <xs:documentation>Specifies the image to display.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="format">
                <xs:annotation>
                    <xs:documentation>Format a type number, select the format type to use on arithmetic.properties with the pattern ${format}.displaying.format =
                        ex: default is present in number.properties as 'default.displaying.format = ##0.00'
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="default-value">
                <xs:annotation>
                    <xs:documentation>Specifies a string to be displayed if the field is empty.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="display-entity" substitutionGroup="AllFields">
        <xs:annotation>
            <xs:documentation>
                This is just like display but looks up a description using the Entity Engine;
                note that if also-hidden is true then it uses the key as the value, not the shown description.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:string" name="entity-name" use="required" />
            <xs:attribute type="xs:string" name="key-field-name" />
            <xs:attribute type="xs:string" name="description" default="${description}" />
            <xs:attribute type="xs:integer" name="size">
                <xs:annotation>
                    <xs:documentation>
                        Specifies the size of the field (as a number of characters),
                        when the text to display exceed the given size it is truncated and add the complete text as a hint
                     </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="cache" type="xs:boolean" default="true"/>
            <xs:attribute name="also-hidden" type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>If set to true, an hidden form field is also rendered, with the name of the field and its content.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="drop-down" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="auto-complete" minOccurs="0" maxOccurs="1" />
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="entity-options" />
                    <xs:element ref="list-options" />
                    <xs:element ref="option" />
                </xs:choice>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute name="allow-empty" type="xs:boolean" default="false"/>
            <xs:attribute name="allow-multiple" type="xs:boolean" default="false"/>
            <xs:attribute name="current" default="selected">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="first-in-list" />
                        <xs:enumeration value="selected" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="no-current-selected-key">
                <xs:annotation>
                    <xs:documentation>The key to mark as selected when there is no current entry value.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:integer" name="size" default="1" />
            <xs:attribute type="xs:string" name="current-description" />
            <xs:attribute type="xs:integer" name="other-field-size" default="0">
                <xs:annotation>
                    <xs:documentation>If non-zero, a text field will conditionally show
                        next to the select control to implement a crude "combo box".
                        In order for this to work there must be a option in the select as:
                        &lt;option key=&quot;_OTHER_&quot; description=&quot;Specify other&quot;/&gt;
                        - with '_OTHER_' being required and any 'description' allowed.
                        In order to use this feature, the javascript code contained in the file:
                        common/js/util/combobox.js must be included in the page.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:integer" name="text-size">
                <xs:annotation>
                    <xs:documentation>Specifies the size of the field (as a number of characters), when the text to display exceed the given size it is truncated and add the complete text as a hint</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="file" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:positiveInteger" name="size" default="25" />
            <xs:attribute type="xs:positiveInteger" name="maxlength" />
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="client-autocomplete-field"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>Tells the browser whether or not to try and autocomplete with values previously entered. Default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="hidden" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute type="xs:string" name="value" />
        </xs:complexType>
    </xs:element>
    <xs:complexType name="hyperlink">
        <xs:complexContent>
            <xs:extension base="link">
                <xs:attribute type="xs:string" name="description">
                    <xs:annotation>
                        <xs:documentation>Specifies the string to display, can use the ${} syntax to insert context values; if empty the value of the field will be printed for a default.</xs:documentation>
                    </xs:annotation>
                </xs:attribute>
                <xs:attribute name="also-hidden" type="xs:boolean" default="true">
                    <xs:annotation>
                        <xs:documentation>If set to true, an hidden form field is also rendered, with the name of the field and its content.</xs:documentation>
                    </xs:annotation>
                </xs:attribute>
                <!-- These attributes have been replaced by the image element -->
                <xs:attribute type="xs:string" name="alternate">
                    <xs:annotation>
                        <xs:documentation>Deprecated - use the image element.</xs:documentation>
                    </xs:annotation>
                </xs:attribute>
                <xs:attribute type="xs:string" name="image-title">
                    <xs:annotation>
                        <xs:documentation>Deprecated - use the image element.</xs:documentation>
                    </xs:annotation>
                </xs:attribute>
                <xs:attribute type="xs:string" name="image-location">
                    <xs:annotation>
                        <xs:documentation>Deprecated - use the image element.</xs:documentation>
                    </xs:annotation>
                </xs:attribute>
                <xs:attribute name="target-type" default="intra-app">
                    <xs:annotation>
                        <xs:documentation>
                            Deprecated - use the url-mode attribute.
                            Actually url-mode does not work when a form like target="javascript: is used
                            Better let it like it is, see OFBIZ-12091
                        </xs:documentation>
                    </xs:annotation>
                    <xs:simpleType>
                        <xs:restriction base="xs:token">
                            <xs:enumeration value="intra-app" />
                            <xs:enumeration value="inter-app" />
                            <xs:enumeration value="content" />
                            <xs:enumeration value="plain" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="hyperlink" type="hyperlink" substitutionGroup="AllFields"/>
    <xs:element name="ignored" substitutionGroup="AllFields">
        <xs:complexType/>
    </xs:element>
    <xs:element name="image" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:string" name="style" />
            <xs:attribute type="xs:string" name="value" />
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute type="xs:string" name="description" />
            <xs:attribute type="xs:string" name="alternate" />
        </xs:complexType>
    </xs:element>
    <xs:element name="lookup" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:string" name="target-form-name" use="required" />
            <xs:attribute type="xs:nonNegativeInteger" name="size" default="25" />
            <xs:attribute type="xs:positiveInteger" name="maxlength" />
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute type="xs:string" name="description-field-name">
                <xs:annotation>
                    <xs:documentation>
                        The name of a field whose value is also filled when coming back from lookup selection.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="target-parameter">
                <xs:annotation>
                    <xs:documentation>Comma separated list of the parameter-names of the fields whose values are passed
                        as parameters to the lookup target form.

                        Accepts Unified Expression Language (JSR 245) notation, i.e. ${}, to allow use of expressions.
                        Expressions are evaluated before splitting at any commas. After splitting, whitespace is trimmed
                        from the beginning and end of the resulting elements.

                        The position of a field name in the list corresponds to the parameter name that will be passed
                        to the lookup form. Parameter names follow the naming convention parmN where N is the list
                        position of the field name, starting with 0.

                        Example: A form has a text input field with parameter-name alpha and value 42; and text input
                        field with parameter-name bravo and value 107. A lookup field has been created for that form
                        with target-parameter="bravo,alpha". When the lookup is performed the resulting request will
                        include parm0=107 and parm1=42.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="client-autocomplete-field"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>
                        Tells the browser whether or not to try and autocomplete with values previously entered.
                        Default to true.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="read-only" type="xs:boolean" default="false">
                <xs:annotation>
                    <xs:documentation>Makes the input field related to this lookup read-only (no edits allowed)</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="presentation" default="layer">
                <xs:annotation>
                    <xs:documentation>
                        Shows the lookup as moveable and resizable layer or popup window.
                        if set to none only autocompletion is active (no lookup form would be call)
                        Default to layer.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="layer" />
                        <xs:enumeration value="window" />
                        <xs:enumeration value="none" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="height">
                <xs:annotation>
                    <xs:documentation>Only layer height. I.e. 250px, 12%</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="width">
                <xs:annotation>
                    <xs:documentation>Only layer width. I.e. 250px, 12%</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="position" default="topleft">
                <xs:annotation>
                    <xs:documentation>Only for layer positionining. Default to topleft corner.</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="center" />
                        <xs:enumeration value="left" />
                        <xs:enumeration value="right" />
                        <xs:enumeration value="topleft" />
                        <xs:enumeration value="topright" />
                        <xs:enumeration value="topcenter" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="fade-background" type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>If true the window background will be faded, default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="initially-collapsed" type="xs:boolean"
                          default="false">
                <xs:annotation>
                    <xs:documentation>If true the search screenlet is collapsed intially, default to false.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="show-description" type="xs:boolean">
                <xs:annotation>
                    <xs:documentation>If true, a special span with css class "tooltip" will be created at right of the lookup button
                        and a description will fill in.
                        If not set then it depends on the "widget.lookup.showDescription" setting.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="include-menu" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute type="xs:string" name="name" use="required" />
            <xs:attribute type="xs:string" name="location" use="required" />
        </xs:complexType>
    </xs:element>
    <xs:element name="include-form" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute type="xs:string" name="name" use="required" />
            <xs:attribute type="xs:string" name="location" use="required" />
        </xs:complexType>
    </xs:element>
    <xs:element name="include-grid" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute type="xs:string" name="name" use="required" />
            <xs:attribute type="xs:string" name="location" use="required" />
        </xs:complexType>
    </xs:element>
    <xs:element name="include-screen" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute type="xs:string" name="name" use="required" />
            <xs:attribute type="xs:string" name="location" use="required" />
        </xs:complexType>
    </xs:element>
    <xs:element name="password" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:positiveInteger" name="size" default="25" />
            <xs:attribute type="xs:positiveInteger" name="maxlength" />
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="client-autocomplete-field"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>Tells the browser whether or not to try and autocomplete with values previously entered. Default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="radio" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="entity-options" />
                <xs:element ref="list-options" />
                <xs:element ref="option" />
            </xs:choice>
            <xs:attribute type="xs:string" name="no-current-selected-key" />
        </xs:complexType>
    </xs:element>
    <xs:element name="range-find" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:positiveInteger" name="size" default="25" />
            <xs:attribute type="xs:positiveInteger" name="maxlength" />
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="client-autocomplete-field"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>Tells the browser whether or not to try and autocomplete with values previously entered. Default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="default-option-from" default="greaterThanEqualTo">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="equals" />
                        <xs:enumeration value="greaterThan" />
                        <xs:enumeration value="greaterThanEqualTo" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="default-option-thru" default="lessThanEqualTo">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="lessThan" />
                        <xs:enumeration value="lessThanEqualTo" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="reset" substitutionGroup="AllFields">
        <xs:complexType/>
    </xs:element>
    <xs:element name="submit" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute name="button-type" default="button">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="button" />
                        <xs:enumeration value="text-link" />
                        <xs:enumeration value="image" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="image-location" />
            <xs:attribute type="xs:string" name="background-submit-refresh-target">
                <xs:annotation>
                    <xs:documentation>Deprecated. Use the on-event-update-area element
                        instead.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="request-confirmation"
                          type="xs:boolean" default="false">
                <xs:annotation>
                    <xs:documentation>If true then the user is presented with a dialog box, if confirmation-message is empty, use default</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="confirmation-message" type="xs:string">
                <xs:annotation>
                    <xs:documentation>The message displayed in confirmation box</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="propagate-callback" type="xs:boolean" default="false">
                <xs:annotation>
                    <xs:documentation>If you are on an edition process with different steps and you want to wait the end of the complete action before using the callback,
                        use propagate-callback="true". The submit will understand that you want to continue your process and will not close the modal to refresh the screen.
                        The callback action will be kept within the different steps
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="text" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:positiveInteger" name="size" default="25" />
            <xs:attribute type="xs:positiveInteger" name="maxlength" />
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="client-autocomplete-field"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>Tells the browser whether or not to try and autocomplete with values previously entered. Default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="mask" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Defines a customized input mask. Use 9 for numeric, a for alpha and * for alphanumeric character.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="read-only" type="xs:boolean" default="false">
                <xs:annotation>
                    <xs:documentation>Makes this text field read-only (no edits allowed)</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="placeholder" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Specifies a short hint that describes the expected value of an input field.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="textarea" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:attribute type="xs:positiveInteger" name="cols" default="60" />
            <xs:attribute type="xs:positiveInteger" name="rows" default="3" />
            <xs:attribute type="xs:positiveInteger" name="maxlength"/>
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="read-only" type="xs:boolean" default="false">
                <xs:annotation>
                    <xs:documentation>Makes this textarea read-only (no edits allowed)</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="visual-editor-enable"
                          type="xs:boolean" default="false">
                <xs:annotation>
                    <xs:documentation>
                        This will enable the HTML editor on this text area from https://alex-d.github.io/Trumbowyg/
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="visual-editor-buttons">
                <xs:annotation>
                    <xs:documentation>
                        Trumbowyg buttons configuration object, as a JSON.parse parsable string (2 dimensions string array).
                        Ex: [['formatting'],['strong','em','del'],['link'],['unorderedList','orderedList'],['horizontalRule']]
                        See https://alex-d.github.io/Trumbowyg/documentation/#button-pane
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="placeholder">
                <xs:annotation>
                    <xs:documentation>
                        Content of the HTML placeholder attribute (https://developer.mozilla.org/fr/docs/Web/HTML/Element/textarea#placeholder), text to be displayed to the user when textarea is empty. Similar to text input placeholder.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="text-find" substitutionGroup="AllFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="sub-hyperlink" />
            </xs:sequence>
            <xs:attribute type="xs:positiveInteger" name="size" default="25" />
            <xs:attribute type="xs:positiveInteger" name="maxlength" />
            <xs:attribute type="xs:string" name="default-value" />
            <xs:attribute name="ignore-case" type="xs:boolean" default="true"/>
            <xs:attribute name="default-option" default="contains">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="equals" />
                        <xs:enumeration value="like" /><!-- this is actually "begins with" -->
                        <xs:enumeration value="contains" />
                        <xs:enumeration value="empty" />
                        <xs:enumeration value="notEqual" />
                        <xs:enumeration value="lessThan" />
                        <xs:enumeration value="lessThanEqualTo" />
                        <xs:enumeration value="greaterThan" />
                        <xs:enumeration value="greaterThanEqualTo" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="client-autocomplete-field"
                          type="xs:boolean" default="true">
                <xs:annotation>
                    <xs:documentation>Tells the browser whether or not to try and autocomplete with values previously entered. Default to true.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="hide-options" default="false">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="true" />
                        <xs:enumeration value="false" />
                        <xs:enumeration value="ignore-case" />
                        <xs:enumeration value="options" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <!-- ================== Field Events ==================== -->
    <xs:element name="on-field-event-update-area">
        <xs:annotation>
            <xs:documentation>Area to be updated when a field event occurs.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="auto-parameters-service"/>
                <xs:element minOccurs="0" ref="auto-parameters-entity"/>
                <xs:element minOccurs="0" ref="auto-parameters-form"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter" />
            </xs:sequence>
            <xs:attribute name="event-type" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="change" />
                        <xs:enumeration value="click" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="area-id" />
            <xs:attribute type="xs:string" name="area-target" />
        </xs:complexType>
    </xs:element>

    <!-- ================== FIELD SUB-ELEMENTS ==================== -->
    <xs:element name="auto-complete">
        <xs:complexType>
            <xs:attribute name="auto-select" type="xs:boolean" default="false"/>
            <xs:attribute name="frequency" type="xs:double" default="0.4" />
            <xs:attribute name="min-chars" type="xs:positiveInteger" default="1" />
            <xs:attribute name="choices" type="xs:positiveInteger" default="10" />
            <xs:attribute name="partial-search" type="xs:boolean" default="true"/>
            <xs:attribute name="partial-chars" type="xs:positiveInteger" default="1" />
            <xs:attribute name="ignore-case" type="xs:boolean" default="true"/>
            <xs:attribute name="full-search" type="xs:boolean" default="true"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="entity-constraint">
        <xs:complexType>
            <xs:attribute type="xs:string" name="name" use="required" />
            <xs:attribute name="operator" default="equals">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="less" />
                        <xs:enumeration value="greater" />
                        <xs:enumeration value="less-equals" />
                        <xs:enumeration value="greater-equals" />
                        <xs:enumeration value="equals" />
                        <xs:enumeration value="not-equals" />
                        <xs:enumeration value="in" />
                        <xs:enumeration value="not-in" />
                        <xs:enumeration value="between" />
                        <xs:enumeration value="like" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="env-name" />
            <xs:attribute type="xs:string" name="value" />
            <xs:attribute name="ignore-if-null" type="xs:boolean" default="false"/>
            <xs:attribute name="ignore-if-empty" type="xs:boolean" default="false"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="entity-options">
        <xs:annotation>
            <xs:documentation>entity-options will look up options for the field in the given entity</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="entity-constraint" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="entity-order-by" />
            </xs:sequence>
            <xs:attribute type="xs:string" name="entity-name" use="required" />
            <xs:attribute type="xs:string" name="key-field-name">
                <xs:annotation>
                    <xs:documentation>The name of the field in the looked up entity that will be used for the key value; if empty defaults to the entry-name of the field this is in.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="description" default="${description}">
                <xs:annotation>
                    <xs:documentation>Will be presented to the user with field values substituted using the ${} syntax.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="cache" type="xs:boolean" default="true"/>
            <xs:attribute name="filter-by-date" default="by-name">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="true" />
                        <xs:enumeration value="false" />
                        <xs:enumeration value="by-name" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="entity-order-by">
        <xs:complexType>
            <xs:attribute type="xs:string" name="field-name" use="required" />
        </xs:complexType>
    </xs:element>
    <xs:element name="in-place-editor">
        <xs:annotation>
            <xs:documentation>Enables in place editon for the display field.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="1" maxOccurs="1">
                    <xs:element ref="simple-editor" />
                </xs:choice>
                <xs:element ref="field-map" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="url" type="xs:string" use="required" />
            <xs:attribute name="cancel-control">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="link" />
                        <xs:enumeration value="button" />
                        <xs:enumeration value="false" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="cancel-text" type="xs:string" />
            <xs:attribute name="click-to-edit-text" type="xs:string" />
            <xs:attribute name="field-post-creation">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="activate" />
                        <xs:enumeration value="focus" />
                        <xs:enumeration value="false" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="form-class-name" type="xs:string" />
            <xs:attribute name="form-id" type="xs:string" />
            <xs:attribute name="highlight-color" type="xs:string" />
            <xs:attribute name="highlight-end-color" type="xs:string" />
            <xs:attribute name="hover-class-name" type="xs:string" />
            <xs:attribute name="html-response" type="xs:boolean" default="false"/>
            <xs:attribute name="loading-class-name" type="xs:string" />
            <xs:attribute name="loading-text" type="xs:string" />
            <xs:attribute name="ok-control">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="link" />
                        <xs:enumeration value="button" />
                        <xs:enumeration value="false" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="ok-text" type="xs:string" />
            <xs:attribute name="param-name" type="xs:string" />
            <xs:attribute name="saving-class-name" type="xs:string" />
            <xs:attribute name="saving-text" type="xs:string" />
            <xs:attribute name="submit-on-blur" type="xs:boolean"/>
            <xs:attribute name="text-after-controls" type="xs:string" />
            <xs:attribute name="text-before-controls" type="xs:string" />
            <xs:attribute name="text-between-controls" type="xs:string" />
            <xs:attribute name="update-after-request-call"
                          type="xs:boolean" default="true"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="list-options">
        <xs:annotation>
            <xs:documentation>list-options will create options based on data in a list</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute type="xs:string" name="list-name" use="required">
                <xs:annotation>
                    <xs:documentation>The name of the list to iterate through to get values.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="list-entry-name">
                <xs:annotation>
                    <xs:documentation>
                        If specified the list entry will be placed in the local
                        context, otherwise each list entry must be a Map that will be expanded
                        into the local context.
                </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="key-name" use="required">
                <xs:annotation>
                    <xs:documentation>
                        The value of the key-name will be the value passed
                        to the server; this should be the full name of the location of the
                        key value in the context, given the list-entry-name or expanded
                        list-entry Map as the options you would most likely use.
                </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute type="xs:string" name="description" default="${description}">
                <xs:annotation>
                    <xs:documentation>Will be presented to the user with field values substituted using the ${} syntax.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="option">
        <xs:complexType>
            <xs:attribute type="xs:string" name="key" use="required" />
            <xs:attribute type="xs:string" name="description">
                <xs:annotation>
                    <xs:documentation>What the user will see in the widget; defaults to the value of the key attribute.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="simple-editor">
        <xs:complexType>
            <xs:attribute name="rows" type="xs:positiveInteger" default="1" />
            <xs:attribute name="cols" type="xs:positiveInteger" default="40" />
        </xs:complexType>
    </xs:element>
    <xs:complexType name="sub-hyperlink">
        <xs:complexContent>
            <xs:extension base="link">
                <xs:attribute type="xs:string" name="description">
                    <xs:annotation>
                        <xs:documentation>Specifies the string to display, can use the ${} syntax to insert context values; if empty the value of the field will be printed for a default.</xs:documentation>
                    </xs:annotation>
                </xs:attribute>
                <xs:attribute type="xs:string" name="use-when" />
                <xs:attribute name="target-type" default="intra-app">
                    <xs:annotation>
                        <xs:documentation>
                            Deprecated - use the url-mode attribute.
                            Actually url-mode does not work when a form like target="javascript: is used
                            Better let it like it is, see OFBIZ-12091
                        </xs:documentation>
                    </xs:annotation>
                    <xs:simpleType>
                        <xs:restriction base="xs:token">
                            <xs:enumeration value="intra-app" />
                            <xs:enumeration value="inter-app" />
                            <xs:enumeration value="content" />
                            <xs:enumeration value="plain" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <xs:attribute name="link-style" type="xs:string">
                    <xs:annotation>
                        <xs:documentation>Deprecated - use the style attribute.</xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="sub-hyperlink" type="sub-hyperlink"/>

  <!-- ================== ACTIONS ==================== -->
    <xs:element name="actions">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="AllActions"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="row-actions">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="AllActions"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="service" substitutionGroup="AllActions">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="field-map" />
            </xs:sequence>
            <xs:attribute type="xs:string" name="service-name" use="required" />
            <xs:attribute type="xs:string" name="result-map" />
            <xs:attribute type="xs:string" name="auto-field-map" default="true">
                <xs:annotation>
                    <xs:documentation>This can be "true", "false" or the name of a Map in the context to use as the source Map for the service context.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <!-- this is deprecated and should not be used; use result-map-list-name instead: <xs:attribute type="xs:string" name="result-map-list-iterator-name"/> -->
            <xs:attribute type="xs:string" name="result-map-list" />
            <xs:attribute name="ignore-error" type="xs:boolean" default="false"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="call-parent-actions" substitutionGroup="AllActions" />
    <xs:element name="entity-and" substitutionGroup="AllActions">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="field-map" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="select-field" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="order-by" />
                <xs:choice minOccurs="0">
                    <xs:element ref="limit-range" />
                    <xs:element ref="limit-view" />
                    <xs:element ref="use-iterator" />
                </xs:choice>
            </xs:sequence>
            <xs:attribute type="xs:string" name="entity-name" use="required" />
            <xs:attribute name="use-cache" type="xs:boolean" default="false"/>
            <xs:attribute name="filter-by-date" default="false">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="true" />
                        <xs:enumeration value="false" />
                        <xs:enumeration value="by-name" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute type="xs:string" name="list" />
            <xs:attribute name="result-set-type" default="scroll">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="forward" />
                        <xs:enumeration value="scroll" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="entity-condition" substitutionGroup="AllActions">
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="0">
                    <xs:element ref="condition-expr" />
                    <xs:element ref="condition-list" />
                    <xs:element ref="condition-object" />
                </xs:choice>
                <xs:element minOccurs="0" ref="having-condition-list" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="select-field" />
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="order-by" />
                <xs:choice minOccurs="0">
                    <xs:element ref="limit-range" />
                    <xs:element ref="limit-view" />
                    <xs:element ref="use-iterator" />
                </xs:choice>
            </xs:sequence>
            <xs:attribute type="xs:string" name="entity-name" use="required" />
            <xs:attribute name="use-cache" type="xs:boolean" default="false"/>
            <xs:attribute name="filter-by-date" default="false">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="true" />
                        <xs:enumeration value="false" />
                        <xs:enumeration value="by-name" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="distinct" type="xs:boolean" default="false"/>
            <xs:attribute type="xs:string" name="delegator-name" />
            <xs:attribute type="xs:string" name="list" />
            <xs:attribute name="result-set-type" default="scroll">
                <xs:simpleType>
                    <xs:restriction base="xs:token">
                        <xs:enumeration value="forward" />
                        <xs:enumeration value="scroll" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>
