From c2a580be1484629e557b967524473a75b2d02274 Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Tue, 1 Feb 2022 15:10:21 -0500 Subject: [PATCH] 18284: Add regex pattern option to chips-input for better tokenization of login groups input chips Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- src/components/chips-input/chips-input.tsx | 33 ++++++++++++++++--- .../group-array-input.tsx | 1 + 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/components/chips-input/chips-input.tsx b/src/components/chips-input/chips-input.tsx index 31e12333..cbb1fb12 100644 --- a/src/components/chips-input/chips-input.tsx +++ b/src/components/chips-input/chips-input.tsx @@ -21,6 +21,7 @@ interface ChipsInputProps { deletable?: boolean; orderable?: boolean; disabled?: boolean; + pattern?: RegExp; } type CssRules = 'chips' | 'input' | 'inputContainer'; @@ -52,10 +53,26 @@ export const ChipsInput = withStyles(styles)( timeout = -1; setText = (event: React.ChangeEvent) => { - this.setState({ text: event.target.value }); + this.setState({ text: event.target.value }, () => { + // If pattern is provided, check for delimiter + if (this.props.pattern) { + const matches = this.state.text.match(this.props.pattern); + // Only create values if 1 match and the last character is a delimiter + // (user pressed an invalid character at the end of a token) + // or if multiple matches (user pasted text) + if (matches && + ( + matches.length > 1 || + (matches.length === 1 && !this.state.text.endsWith(matches[0])) + )) { + this.createNewValue(matches.map((i) => i)); + } + } + }); } handleKeyPress = (e: React.KeyboardEvent) => { + // Handle special keypresses if (e.key === 'Enter') { this.createNewValue(); e.preventDefault(); @@ -64,11 +81,17 @@ export const ChipsInput = withStyles(styles)( } } - createNewValue = () => { + createNewValue = (matches?: string[]) => { if (this.state.text) { - const newValue = this.props.createNewValue(this.state.text); - this.setState({ text: '' }); - this.props.onChange([...this.props.values, newValue]); + if (matches && matches.length > 0) { + const newValues = matches.map((v) => this.props.createNewValue(v)); + this.setState({ text: '' }); + this.props.onChange([...this.props.values, ...newValues]); + } else { + const newValue = this.props.createNewValue(this.state.text); + this.setState({ text: '' }); + this.props.onChange([...this.props.values, newValue]); + } } } diff --git a/src/views-components/virtual-machines-dialog/group-array-input.tsx b/src/views-components/virtual-machines-dialog/group-array-input.tsx index 12a73019..d3714dce 100644 --- a/src/views-components/virtual-machines-dialog/group-array-input.tsx +++ b/src/views-components/virtual-machines-dialog/group-array-input.tsx @@ -56,6 +56,7 @@ const StyledInputComponent = withStyles(styles)( createNewValue={identity} inputComponent={Input} chipsClassName={classes.chips} + pattern={/[_a-z][-0-9_a-z]*/ig} inputProps={{ error: meta.error, }} />; -- 2.30.2