Widgets are used to make up the UI of edit screens for entities, and include combo boxes, text areas, radio buttons and many more UI components.
Widgets are returned from the Widgets API Resource end point or by using the "Widgets" expand when retrieving an entity or project.
All widgets share the following value/options:
Property | Type | Description |
---|
WidgetCategory | string | Either "intrinsic" or "custom", for in-built and custom widgets |
Name | string | Name of the inbuilt or custom widget |
Label | string | The label for the widget |
WidgetType | string | A type-descriminator, used for determining how the widget should be rendered |
ImplementationType | string | The handler (class) in code which is used to represent this widget, this information can be used to provide additional customisation to a widget based on what information it represents. |
HandlerType | string | The key of the handler being used to render this widget, this information can be used to provide additional customisation to a widget based on what information it represents. |
ValueType | string | The JSON Schema type of the value for this widget, these should be consistent with the swagger for the API. |
ItemId | string | A unique ID assigned to some inbuilt widgets so they can be handled in special ways within the UI - for example "remote links" for a requirement will not be shown if the requirement is being created, or if it has yet to be synchronized with any remote entities, and that remote links widget is identified by it's ItemId. |
Required | Boolean | If present, this determines if the widget is required or not. If the value is not present, the default behaviour of not-required is assumed. |
ReadOnly | Boolean | If present, this widget is in a read-only state. |
TabIndex | integer | Represents the tab-order of fields on screen - normally widgets are returned in-order anyway, but this can be used for explicit tab-order assignment which does not conform to field order. |
Hidden | Boolean | If the value is present, determines if the field is current hidden or not - if not present, the field is assumed to be visible. |
FormName | string | Generally retained for internal use by Enterprise Tester, if present, this will be the key used for the key/value pair of this widget when submitted back to the server. |
Description | string | Description of the field (descriptions can be captured on the custom field configure screen for each custom field). Descriptions are not currently used within the Enterprise Tester UI, but are available for 3rd party tool developers. |
In addition each widget may have more options configured specific to that type of field.
Note: intrinsic fields do not currently include their current value in their representation, the value is instead retrieved from the model, using the 'Name' or 'FormName' as the key.
The assign user field is used to pick an assignee - it makes use of the Users Search API resource to retrieve users for the picker.
Widget Type: AssignUserPicker
Code Block |
---|
|
{
"FieldCategory": "intrinsic",
"Name": "AssignedTo",
"Label": "Assigned To",
"WidgetType": "AssignUserPicker",
"ImplementationType": "EnterpriseTester.Core.CustomFields.IntrinsicFields.AssignededTo",
"HandlerType": "AssignedTo",
"ItemId": "assigned-to",
"Required": false,
"TabIndex": 106,
"FormName": "requirement.AssignedTo"
}
|
Widget Type: CascadingSelect
The cascading select is a series of 2 or more combo boxes, where selections and the first level determine what child options can be selected in the second combo etc. The number of combo-boxes requires is determined by the "Levels" property (2 in this case for the example below).
Selections are represented as an array, with the first element being the first-level section, second element being the second-level selection and so on, the field must support optional selection of second/third etc. level options.
Code Block |
---|
|
{
"Levels": 2,
"Value": [
{
"Identifier": "10005",
"Text": "Level A"
},
{
"Identifier": "10007",
"Text": "Level 1"
}
],
"Options": [
{
"Identifier": "10005",
"Text": "Level A",
"Children": [
{
"Identifier": "10007",
"Text": "Level 1",
"Children": []
},
{
"Identifier": "10010",
"Text": "Level 2",
"Children": []
}
]
},
{
"Identifier": "10006",
"Text": "Level B",
"Children": [
{
"Identifier": "10008",
"Text": "Level 2",
"Children": []
},
{
"Identifier": "10009",
"Text": "Level 1",
"Children": []
}
]
}
],
"FieldCategory": "custom",
"Name": "Cascading",
"Label": "Cascading`",
"WidgetType": "CascadingSelect",
"ImplementationType": "EnterpriseTester.Plugins.DefectTracking.Fields.DefectTrackerCascadingSelectCustomField",
"HandlerType": "Defect Tracker Cascading Select",
"ValueType": "IValue[]",
"Required": false,
"TabIndex": 117,
"FormName": "requirement.Cascading",
"Description": ""
}
|
Widget Type: Checkbox
Code Block |
---|
|
{
"Value": true,
"FieldCategory": "custom",
"Name": "CustomCheckBox",
"Label": "CustomCheckBox",
"WidgetType": "CheckBox",
"ImplementationType": "EnterpriseTester.Plugins.CustomFields.Handlers.CheckboxFieldType",
"HandlerType": "Checkbox",
"ValueType": "Boolean",
"Required": false,
"TabIndex": 108,
"FormName": "requirement.CustomCheckBox",
"Description": ""
}
|
The date picker field expects the date to submitted as a string, conforming to the FormatString (.Net Date/Time format string). In addition the .Net date/time format string, we also include a FormatCode which is a PHP and ExtJS compatible parsing/format syntax (see the Ext.Date documentation for more details).
Widget Type: Date
Code Block |
---|
|
{
"FormatCode": "j/i/Y",
"FormatString": "d/mm/yyyy",
"FieldCategory": "custom",
"Name": "CustomDate",
"Label": "CustomDate",
"WidgetType": "Date",
"ImplementationType": "EnterpriseTester.Plugins.CustomFields.Handlers.DateField",
"HandlerType": "Date",
"ValueType": "Date",
"Required": false,
"TabIndex": 109,
"FormName": "requirement.CustomDate",
"Description": ""
}
|
Widget Type: RequirementExternalComments
Code Block |
---|
|
{
"FieldCategory": "intrinsic",
"Name": "ExternalComments",
"Label": "External Comments",
"WidgetType": "RequirementExternalComments",
"ImplementationType": "EnterpriseTester.Core.CustomFields.IntrinsicFields.RequirementExternalComments",
"HandlerType": "RequirementExternalComments",
"ItemId": "requirementcommentsgrid",
"Required": false,
"ReadOnly": true,
"TabIndex": 109
}
|
Widget Type: ExternalLinks
Code Block |
---|
|
{
"FieldCategory": "intrinsic",
"Name": "ExternalLinks",
"Label": "External Links",
"WidgetType": "ExternalLinks",
"ImplementationType": "EnterpriseTester.Core.CustomFields.IntrinsicFields.ExternalLinksGrid",
"HandlerType": "ExternalLinksGrid",
"ItemId": "externallinksgrid",
"Required": false,
"ReadOnly": true,
"TabIndex": 110
}
|
Widget Type: HtmlEditor
Code Block |
---|
|
{
"Value": "<b><font color=\"#ff0000\">Hello world</font></b>",
"FieldCategory": "custom",
"Name": "CustomRichText",
"Label": "CustomRichText",
"WidgetType": "HtmlEditor",
"ImplementationType": "EnterpriseTester.Plugins.CustomFields.Handlers.RichTextField",
"HandlerType": "RichText",
"ValueType": "String",
"Required": false,
"TabIndex": 114,
"FormName": "requirement.CustomRichText",
"Description": ""
}
|
Widget Type: Label
This component is used for rendering a read-only text widget.
Code Block |
---|
|
{
"FieldCategory": "intrinsic",
"Name": "CreatedBy",
"Label": "Raised By",
"WidgetType": "Label",
"ImplementationType": "EnterpriseTester.Core.CustomFields.IntrinsicFields.Label",
"HandlerType": "Label",
"ValueType": "String",
"Required": false,
"TabIndex": 102,
"FormName": "incident.CreatedBy",
"Value": "Joe Blogs (joeb)"
}
|
Widget Type(s): CheckBoxGroup, MultiSelect
Code Block |
---|
|
{
"Values": [
"911d5b79-cdf2-477e-ae36-2fb4a0afa2b9",
"cb3459de-f3a2-4ce5-bb54-25cb20778d5d"
],
"Options": [
{
"Identifier": "911d5b79-cdf2-477e-ae36-2fb4a0afa2b9",
"Text": "A"
},
{
"Identifier": "ad0b2fc6-be31-4be8-83b4-c32ff12e50b6",
"Text": "B"
},
{
"Identifier": "cb3459de-f3a2-4ce5-bb54-25cb20778d5d",
"Text": "C"
}
],
"FieldCategory": "custom",
"Name": "CustomMultiSelect",
"Label": "CustomMultiSelect",
"WidgetType": "MultiSelect",
"ImplementationType": "EnterpriseTester.Plugins.CustomFields.Handlers.MultiSelectField",
"HandlerType": "MultiSelect",
"ValueType": "String[]",
"Required": false,
"TabIndex": 107,
"FormName": "requirement.CustomMultiSelect",
"Description": ""
}
|
Multi-line Text Area
Widget Type: TextArea
Code Block |
---|
|
{
"Value": "This is line 1\nThis is line 2",
"FieldCategory": "custom",
"Name": "CustomTextArea",
"Label": "CustomTextArea",
"WidgetType": "TextArea",
"ImplementationType": "EnterpriseTester.Plugins.CustomFields.Handlers.TextAreaField",
"HandlerType": "TextArea",
"ValueType": "String",
"Required": false,
"TabIndex": 105,
"FormName": "requirement.CustomTextArea",
"Description": ""
}
|
Widget Type(s): ComboBox, RadioGroup
Code Block |
---|
|
{
"Value": "9bf6adcd-d3de-4e0f-b794-1fc898cf0fa4",
"Options": [
{
"Identifier": "9bf6adcd-d3de-4e0f-b794-1fc898cf0fa4",
"Text": "A"
},
{
"Identifier": "536e8f83-6c4a-4bbd-bd1d-e9c81071f190",
"Text": "B"
},
{
"Identifier": "bcf55fd1-3f85-4f21-b316-afc5bd085e0f",
"Text": "C"
}
],
"FieldCategory": "custom",
"Name": "CustomComboBox",
"Label": "CustomComboBox",
"WidgetType": "ComboBox",
"ImplementationType": "EnterpriseTester.Plugins.CustomFields.Handlers.ComboBoxField",
"HandlerType": "ComboBox",
"ValueType": "String",
"Required": false,
"TabIndex": 106,
"FormName": "requirement.CustomComboBox",
"Description": ""
}
|
Single-line Text widget
Widget Type: Text
Code Block |
---|
|
{
"Value": "Hello world",
"MinLength": 1,
"MaxLength": 1024,
"MaxLengthText": "Field must be between 1 and 1024 characters long",
"MinLengthText": "Field must be between 1 and 1024 characters long",
"FieldCategory": "custom",
"Name": "CustomText",
"Label": "CustomText",
"WidgetType": "Text",
"ImplementationType": "EnterpriseTester.Plugins.CustomFields.Handlers.TextField",
"HandlerType": "Text",
"ValueType": "String",
"Required": false,
"TabIndex": 104,
"FormName": "requirement.CustomText",
"Description": "",
"EmptyText": "Please enter some text"
}
|
Time span fields are rendered using the text widget - to provide an alternative representation of this field in your own tool, use the HandlerType or ImplementationType to detect the presence of the estimated or actual duration fields:
Widget Type: Text
Code Block |
---|
|
{
"EmptyText": "eg. 4d, 5h 30m",
"FieldCategory": "intrinsic",
"Name": "EstimatedDuration",
"Label": "Est. Duration",
"WidgetType": "Text",
"ImplementationType": "EnterpriseTester.Core.CustomFields.IntrinsicFields.EstimatedDuration",
"HandlerType": "EstimatedDuration",
"ValueType": "String",
"Required": false,
"TabIndex": 105,
"FormName": "requirement.EstimatedDurationString"
}
|