[IGN-13880] Ignition 8.3 SDK ServiceConnectorExtensionPoint Bugs/Requests/Questions

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

  1. In a record field decorated with @FormField(FormFieldType.TEXTAREA), while the gateway Service 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 a FormFieldType.TEXTAREA.

  2. When using ServiceConnectorExtensionPoint.validate(S settings, ValidationErrors.Builder errors) to validate Create Connection field input, messages added to errors 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.

  3. After clicking Service Connectors > Connections > Create Connection, when the Create 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.

  4. 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.

    ignition-flickering-tag-values

Feature Requests

  1. 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 a Referenced secret, but not Embedded since it is restricted to single line only, and it would be nice to not have the forced indirection of Referenced secrets if someone just wants to paste it in the Create Connection dialog but still have it encrypted (not a FormFieldType.TEXTAREA).

  2. For SecretConfig fields in records with @FormField(FormFieldType.SECRET), it would be nice if rather than only having None, Embedded, and Referenced options, to also have a File 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 than FormFieldType.File.

  3. For validating records for ServiceConnectorExtensionPoints/AbstractExtensionPoints, 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 the Create Connection dialog while typing. Alternatively, a decorator which specifies a validator class to be loaded and used for validation, passing the AbstractExtensionPoint for context, allowing gateway context to be passed to the validator inside of the AbstractExtensionPoint, would be nice. (Or just pass the gateway context?)

  4. 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 the ids and labels for form choices, and takes the AbstractExtensionPoint 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 passed AbstractExtensionPoint argument. (Or just pass the gateway context?)

Questions

  1. On the gateway Platform > System > Modules page, where is the Author field value originating from and how can I add this to a module?

  2. 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.

  3. On the gateway Platform > System > Modules page, it looks like the ability to navigate to a static Documentation page/website included in the module was removed. Is this going to return in 8.3?

  4. I am having trouble figuring out how to use multiple FormFieldTypes 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:

I created a ticket for bug #1 you reported. Going to point the web UI team at this thread tomorrow to handle the rest.

Not entirely sure form validation on loading is expected. Required fields are indicated by a * in the UI that may need more distinction, and if you provide no value for an empty but required field on form submission it shouldn’t be surprising that validation fails. I don’t think the behavior in 8.1 would have been different, but I’ll leave this up to the appropriate team to decide.

Known issue, see 3rd Party Modules, Vendor Name .

Module hot loading was removed for 8.3 and won’t be coming back.

@Kevin.Herron Thank you.

I see where you are coming from regarding validation on load. For the UI team: Looking back at the example code and other settings forms, the @Required decorator doesn’t seem to add the required asterisk * indicator. However, some kind of color highlighting might be beneficial: I have a form with 36 fields and identifying what is wrong is painful when there is no visual indicator and the Create Connection button is disabled (therefore the user can’t initiate validation). To figure out which field had a bad value, I had to keep changing values in different fields until the Create Connection button became enabled. It’s one thing for me to torment myself with my own creation that I in theory know how to use, but tormenting an end user is another story. An alternative might be to leave the Create Connection button enabled and allow the user to initiate validation by clicking it?

Ooph, you’re right.

All the config fields that are required have a @Label annotation that includes it, e.g. @Label("CIP Connection Size *"). How utterly jank.

This is also a known bug the web UI team has high on their priority list.

I'm actively working on some other refinements to the tag browser (caused by incidental changes in gateway <-> designer communications) that hopefully iron this out ~soon.

All the plumbing is still there on the backend and the hosted module docs should still work - there's just nothing on the frontend to actually create the link :man_facepalming:

1 Like