I like the changes I’m seeing in the Ignition 8.3.0-beta2 SDK. I'm using the ServiceConnectorExtensionPoint
with the gateway deployed via docker and ran into a few issues:
Bugs
-
In a record field decorated with
@FormField(FormFieldType.TEXTAREA)
, while the gatewayService Connectors > Connections > Create Connection
dialog is a multiline text field, pressing enter while editing the field does not allow me to create a new line. However, I am able to paste multiline content. My expected behavior is that I should be able to press enter and type multiline text into aFormFieldType.TEXTAREA
. -
When using
ServiceConnectorExtensionPoint.validate(S settings, ValidationErrors.Builder errors)
to validateCreate Connection
field input, messages added toerrors
appear as raw json content in the UI messagebox. I'm guessing this is supposed to be a formatted messagebox for each error rather than dumping raw json. -
After clicking
Service Connectors > Connections > Create Connection
, when theCreate Connection
dialog appears, fields which are invalid (e.g., record field decorated by@Required
and@DefaultValue("null")
) are not highlighted in red. My expected behavior is that validation occurs when the form is loaded and fields that need corrected by the user are highlighted in red as invalid. Since form data isn't validated on load, if there are a ton of settings, it can take a good bit of toggling values to figure out which field is invalid. -
In the tag browser of the designer on Debian 12, tag values are invisible and/or flicker. Values are being periodically written to the default tag provider from a remote device, but I don’t believe the tag value changes account for the flicker.
Feature Requests
-
For
SecretConfig
fields in records, it would be nice to have a@FormField(FormFieldType.SECRETAREA)
along with the@FormField(FormFieldType.SECRET)
to provide multiline input for multiline secrets such as TLS certs. It looks like you can accomplish this with aReferenced
secret, but notEmbedded
since it is restricted to single line only, and it would be nice to not have the forced indirection ofReferenced
secrets if someone just wants to paste it in theCreate Connection
dialog but still have it encrypted (not aFormFieldType.TEXTAREA
). -
For
SecretConfig
fields in records with@FormField(FormFieldType.SECRET)
, it would be nice if rather than only havingNone
,Embedded
, andReferenced
options, to also have aFile
option for interfacing with file-based content such as TLS certs loaded from container-deployment secrets. Validation that the file exists and has readable permissions would be a bonus. While I understand that this can be accomplished using config json files, it looks like a relatively ugly option (in terms of ease of use in a CI/CD environment) in comparison to container secrets when doing a container deployments and loading from file. Having the file path as a secret may be beneficial rather thanFormFieldType.File
. -
For validating records for
ServiceConnectorExtensionPoint
s/AbstractExtensionPoint
s, it would be nice to have a.validateField(S settings, ValidationErrors.Builder errors)
method which validates fields as they are being typed, or.validateField(String name, Object value, ValidationErrors.Builder errors)
method which validates an individual field as the user is typing, with error text appearing below the input field in theCreate Connection
dialog while typing. Alternatively, a decorator which specifies a validator class to be loaded and used for validation, passing theAbstractExtensionPoint
for context, allowing gateway context to be passed to the validator inside of theAbstractExtensionPoint
, would be nice. (Or just pass the gateway context?) -
For populating
@FormField(FormFieldType.SELECT)
choices, it would be nice to have a decorator similar to@FormChoices()
but specifying a class/interface with method which provides theids
andlabels
for form choices, and takes theAbstractExtensionPoint
as a method argument. Using this, the field could be populated with relevant information such as the names of available tag providers if the gateway context is provided by the passedAbstractExtensionPoint
argument. (Or just pass the gateway context?)
Questions
-
On the gateway
Platform > System > Modules
page, where is theAuthor
field value originating from and how can I add this to a module? -
On the gateway
Platform > System > Modules
page, it looks like the ability to restart a module has been removed. Is this going to return in 8.3? This was nice for remote debugging when deployed via docker to hook into module startup/re-startup. -
On the gateway
Platform > System > Modules
page, it looks like the ability to navigate to a staticDocumentation
page/website included in the module was removed. Is this going to return in 8.3? -
I am having trouble figuring out how to use multiple
FormFieldType
s as shown in the example below. May I please have some pointers on how to properly use these? I see that the Kafka connector has a list/table input, which is what I am expecting from@FormField(FormFieldType.VALUE_TABLE)
/@FormField(FormFieldType.VALUE_TABLE)
.
From the Kafka Connector:
Record loaded by ServiceConnectorExtensionPoint.getWebUiComponent(ComponentType type)
:
public record HmSettings(
// UI is like @FormField(FormFieldType.TEXT), not an editable list
// Error: {"messages":["java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at path $.testList"],"fieldMessages":[]}
@FormCategory("Category")
@Label("Value List")
@FormField(FormFieldType.VALUE_TABLE) // If commented out, causes "Application Error \n An application error has occurred. \n Check browser console for details"
@Required
@ListType(String.class) // Also tried LinkedList.class
List<String> testList,
// UI is like @FormField(FormFieldType.TEXT), not file picker/browser
// Input can be any string
@FormCategory("Category")
@Label("File")
@Required
@FormField(FormFieldType.FILE)
String testFile,
// UI is like @FormField(FormFieldType.TEXT), not date picker
// Input must be a parseable date like '2025-08-10T10:00:00Z'
@FormCategory("Category")
@Label("DateTime")
@Required
@FormField(FormFieldType.DATETIME)
Date testDatetime,
// UI is like @FormField(FormFieldType.TEXT), not editable table
// Error: {"messages":["java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at path $.testTable"],"fieldMessages":[]}
@FormCategory("Category")
@Label("Table")
@Required
@FormField(FormFieldType.VALUE_TABLE)
@ListType(TestType.class) // Also tried with this commented out, makes the UI input field disappear/invisible
List<TestType> testTable
) {
public record TestType(
@Label("Data1")
@Required
String data1,
@Label("Data2")
@Required
String data2
) {}
}
Resulting Output: