node-red-contrib-chatbot
Version:
REDBot a Chat bot for a full featured chat bot for Telegram, Facebook Messenger and Slack. Almost no coding skills required
129 lines (119 loc) • 3.22 kB
JavaScript
import React from 'react';
import _ from 'lodash';
import PropTypes from 'prop-types';
import {
Form,
FormControl,
FlexboxGrid,
IconButton,
Icon,
SelectPicker,
Whisper,
Tooltip,
InputGroup,
Input,
TagPicker
} from 'rsuite';
import './style.scss';
import FieldTypes from './field-types';
import BooleanField from './fields/boolean';
import DateField from './fields/date';
import NumberField from './fields/number';
const InputWithInfo = ({ description, ...rest }) => {
return (
<InputGroup className="input-with-info" inside>
<Input {...rest} />
{!_.isEmpty(description) && (
<InputGroup.Addon>
<Whisper trigger="hover" speaker={<Tooltip placement="top">{description}</Tooltip>}>
<Icon icon="help-o"/>
</Whisper>
</InputGroup.Addon>
)}
</InputGroup>
);
};
const FieldEditor = ({
field,
onChange = () => {},
onRemove = () => {},
description
}) => {
let accepter;
let additionalProps = {};
if (field.type === 'boolean') {
accepter = BooleanField;
} else if (field.type === 'date') {
accepter = DateField;
} else if (field.type === 'number') {
accepter = NumberField;
} else if (field.type === 'tags') {
accepter = TagPicker;
additionalProps = {
data: !_.isArray(field.value) ?
[] : field.value.map(item => ({ value: item, label: item })),
creatable: true,
searchable: true,
preventOverflow: false,
block: true
};
}
return (
<div className="field-editor">
<Form
layout="inline"
formValue={field}
onChange={field => onChange(field)}
autoComplete="off"
>
<FlexboxGrid justify="space-between" style={{ marginBottom: '10px', marginRight: '0px' }}>
<FlexboxGrid.Item colspan={7}>
<FormControl
name="name"
placeholder="Name"
accepter={InputWithInfo}
description={description}
/>
</FlexboxGrid.Item>
<FlexboxGrid.Item colspan={5}>
<FormControl
name="type"
placeholder="Type"
accepter={SelectPicker}
data={FieldTypes}
block
searchable={false}
cleanable={false}
/>
</FlexboxGrid.Item>
<FlexboxGrid.Item colspan={9}>
<FormControl
name="value"
placeholder="value"
accepter={accepter}
{...additionalProps}
/>
</FlexboxGrid.Item>
<FlexboxGrid.Item colspan={1} align="right">
<IconButton
onClick={() => onRemove()}
icon={<Icon icon="close" />}
size="md"
/>
</FlexboxGrid.Item>
</FlexboxGrid>
</Form>
</div>
);
};
FieldEditor.propTypes = {
field: PropTypes.shape({
name: PropTypes.string,
type: PropTypes.oneOf(['string', 'boolean', 'date', 'number', 'tags']),
value: PropTypes.any
}),
onChange: PropTypes.func,
onRemove: PropTypes.func,
description: PropTypes.string
};
export default React.memo(FieldEditor);