All files / src/components/array-input array-input.tsx

53.85% Statements 14/26
37.5% Branches 3/8
33.33% Functions 1/3
42.11% Lines 8/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67                                    31x 31x   31x                       31x 2x 2x   2x                               2x                          
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { Intent, TextArea } from '@blueprintjs/core';
import React, { useState } from 'react';
 
import { compact } from '../../utils';
 
export interface ArrayInputProps {
  className?: string;
  values: string[] | undefined;
  onChange: (newValues: string[] | undefined) => void;
  placeholder?: string;
  large?: boolean;
  disabled?: boolean;
  intent?: Intent;
}
 
export const ArrayInput = React.memo(function ArrayInput(props: ArrayInputProps) {
  const { className, placeholder, large, disabled, intent } = props;
  const [stringValue, setStringValue] = useState();
 
  const handleChange = (e: any) => {
    const { onChange } = props;
    const stringValue = e.target.value;
    const newValues: string[] = stringValue.split(/[,\s]+/).map((v: string) => v.trim());
    const newValuesFiltered = compact(newValues);
    if (stringValue === '') {
      onChange(undefined);
      setStringValue(undefined);
    } else if (newValues.length === newValuesFiltered.length) {
      onChange(newValuesFiltered);
      setStringValue(undefined);
    } else {
      setStringValue(stringValue);
    }
  };
 
  return (
    <TextArea
      className={className}
      value={stringValue || (props.values || []).join(', ')}
      onChange={handleChange}
      placeholder={placeholder}
      large={large}
      disabled={disabled}
      intent={intent}
      fill
    />
  );
});