What I am trying to do:
I have an HTML field that is looping through an array of files that the user has uploaded to the form in a separate file-upload section. For each file in the files array, the HTML field will display a text input whose value will be pre-loaded with the filename of the file. (e.g. if someone uploads a PDF file called ‘business_license’ then there will be a text input with the value of ‘business_license’ in it.) These text inputs allow the user to change the name of the file(s) if they wish prior to submitting the form. There needs to be a validation done on the filenames to ensure they are valid using Windows/Mac/Linux filename standards (no “?”, “:”, etc.)
My attempted solutions:
Regex in validator_calc
My initial thought was to use regex to accomplish this using the following pattern: ^[^\x00\/:?"<>|. ]$
I’m not great at regex, but my understanding is that this pattern should only match with strings that don’t match any of the characters listed between [ and ]. I used a validator_calc function using a lodash filter method that would run model.files all through a match()
function. The problem is that FM BetterForms doesn’t like the pattern I made and claims it’s a “bad string” and won’t let the code execute at all.
This also won’t let me put an error message by the offending text input since I’d only have on errorMsg for the whole HTML field.
Regex as the validator type
I read in the docs that you could use a regex validator making use of a “pattern” key. So I tried changing my HTML field to have the following validation settings:
{
...
"validator": "regexp",
"pattern": "^[^\x00\\\/:*?"<>|\. ]*$"
...
}
This doesn’t work because the HTML field has multiple inputs and FM BetterForms doesn’t seem to let me specify that I want it to look at model.files in order to get the array of filenames to run against the regex pattern.
This also won’t let me put an error message by the offending text input since I’d only have on errorMsg for the whole HTML field.
@blur calling a namedAction
This is what I believe I am reduced to. In the HTML field where I am looping through model.files and generating the text inputs, I could add an @blur hook that would call my own namedAction where I can run whatever validation I choose to. This would theoretically allow me to write my own pattern without whatever BF is tripping over when it thinks my pattern is a “bad string” while also letting me add error messages directly to the offending text input. However, I’m at a loss for how to make a namedAction insert an error into the form itself. Displaying a message is easy enough, but how do I tell the form that there is an error present and not allow submission of the form until the error is cleared?
TL;DR
I have multiple text inputs in an HTML field that need to be validated. How can I do so most expediently and natively within FM BetterForms?