import React, { useEffect, useCallback } from "react"; import { Field, FieldArray, WrappedFieldArrayProps, WrappedFieldMetaProps, WrappedFieldInputProps, } from "redux-form"; import styled from "styled-components"; import { Icon } from "@blueprintjs/core"; import { FormIcons } from "icons/FormIcons"; import BaseControl, { ControlProps, ControlData } from "./BaseControl"; import { ControlType } from "constants/PropertyControlConstants"; import DynamicTextField from "components/editorComponents/form/fields/DynamicTextField"; import { Colors } from "constants/Colors"; import { TextInput, TextInputProps } from "design-system"; export interface KeyValueArrayControlProps extends ControlProps { name: string; label: string; maxLen?: number; description?: string; actionConfig?: any; extraData?: ControlData[]; isRequired?: boolean; } const FormRowWithLabel = styled.div` display: flex; flex: 1; flex-direction: row; & svg { cursor: pointer; } `; const StyledTextInput = styled(TextInput)` min-width: 66px; input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0px; } `; function KeyValueRow( props: KeyValueArrayControlProps & WrappedFieldArrayProps, ) { const { extraData = [] } = props; const keyName = getFieldName(extraData[0]?.configProperty); const valueName = getFieldName(extraData[1]?.configProperty); const keyFieldProps = extraData[0]; useEffect(() => { // Always maintain 1 row if (props.fields.length < 1) { for (let i = props.fields.length; i < 1; i += 1) { if (keyName && valueName) { props.fields.push({ [keyName[1]]: "", [valueName[1]]: "" }); } else { props.fields.push({ key: "", value: "" }); } } } }, [props.fields, keyName, valueName]); useEffect(() => { if (typeof props.fields.getAll() === "string") { const fieldsValue: any[] = JSON.parse(`${props.fields.getAll()}`); props.fields.removeAll(); fieldsValue.forEach((value, index) => { props.fields.insert(index, value); }); } }, [props.fields]); const keyFieldValidate = useCallback( (value: string) => { if (value && keyFieldProps?.validationRegex) { const regex = new RegExp(keyFieldProps?.validationRegex); return regex.test(value) ? { isValid: true } : { isValid: false, message: keyFieldProps.validationMessage }; } return undefined; }, [keyFieldProps?.validationRegex, keyFieldProps?.validationMessage], ); const maxLen = props.maxLen; //if maxLen exists apply a check on the length const showAddIcon = (index: number): boolean => maxLen ? index === props.fields.length - 1 && props.fields.length < maxLen : index === props.fields.length - 1; return typeof props.fields.getAll() === "object" ? ( <> {props.fields.map((field: any, index: number) => { let keyTextFieldName = `${field}.key`; let valueTextFieldName = `${field}.value`; if (keyName && Array.isArray(keyName) && keyName?.length) keyTextFieldName = `${field}.${keyName[1]}`; if (valueName && Array.isArray(valueName) && valueName?.length) valueTextFieldName = `${field}.${valueName[1]}`; return ( 0 ? "16px" : "0px" }} >
{!props.actionConfig && (
{showAddIcon(index) ? ( { props.fields.push({ key: "", value: "" }); }} style={{ marginLeft: "16px", alignSelf: "center" }} /> ) : ( props.fields.remove(index)} style={{ marginLeft: "16px", alignSelf: "center" }} width={20} /> )}
)} {props.actionConfig && ( )}
); })} ) : null; } class KeyValueArrayControl extends BaseControl { render() { const name = getFieldName(this.props.configProperty); return ( ); } getControlType(): ControlType { return "KEYVALUE_ARRAY"; } } const getFieldName = (configProperty: string): string[] | undefined => { if (configProperty) return configProperty.split("[*]."); }; const getType = (dataType: string | undefined) => { switch (dataType) { case "PASSWORD": return "password"; case "NUMBER": return "number"; default: return "text"; } }; function renderTextInput( props: TextInputProps & { dataType?: "text" | "number" | "password"; placeholder?: string; defaultValue: string | number; isRequired: boolean; keyFieldValidate?: (value: string) => { isValid: boolean; message: string }; errorMsg?: string; helperText?: string; } & { meta: Partial; input: Partial; }, ): JSX.Element { return ( ); } export default KeyValueArrayControl;